', 1000)
INSERT INTO dbo.Orders (OrderDate, CustomerID) VALUES ('2003/9/23', 1000)
GO
我们来查看这些数据是否完整录入:
因为OrdersHistory表我们还没有归档数据,所以为空。
www.2cto.com
我们来分条件查询下:
1、查询某个分区
这里我们要用到$partition函数。这个函数在联机丛书中是这样解释的:
用法:
为任何指定的分区函数返回分区号,一组分区列值将映射到该分区号中。
语法:
[ database_name. ] $PARTITION.partition_function_name(expression)
参数:
database_name
partition_function_name
对其应用一组分区列值的任何现有分区函数的名称。
expression
其数据类型必须匹配或可隐式转换为其对应分区列数据类型的表达式。expression 也可以是当前参与 partition_function_name 的分区列的名称。
www.2cto.com
返回类型:
int
备注:
$PARTITION 返回从 1 到分区函数的分区数之间的 int 值。
$PARTITION 将针对任何有效值返回分区号,无论此值当前是否存在于使用分区函数的分区表或索引中。
我们来查询分区表Order的第一个分区,代码如下:
可以看到我们查询出来的数据全部为2002年的,也就是说在第一分区中我们存入的数据都是小于2003年,按照此推断2003年的数据,就应该存在第二分区中:
结果如我们所料,我们可以按照这个分区进行分组来查看各个分区的数据行多少,代码如下:
select $partition.pf_OrderDate(OrderDate) as Patition,COUNT(*) countRow from dbo.Orders
group by $partition.pf_OrderDate(OrderDate)
还可以通过$Partition函数获得一组分区标识列值的分区号,例如获得2002属于哪个分区,代码如下:
2、归档数据
www.2cto.com
假如现在是2003年年初,那么我们就可以把2002您所有的交易记录归档到我们刚才建立的历史订单表HistroryOrder中。代码如下:
Use Sales
go
alter table orders switch partition 1 to ordersHistory partition 1
go
现在我们再重新查看这两张表的数据:
这时候Orders表只剩下2003年的数据,而OdersHistory表中包含了2002年的数据。
简单点讲就是把第一区的数据导入到另一张分区表的第一区中
当然如果到了2004年年初,我们就可以归档2003年的所有交易数据。
Use Sales
go
alter table orders switch partition 2 to ordersHistory partition 2
go
这里需要注意的是我们按照区进行数据修改的时候,必须是同一种分区函数下的分区表进行操作,并且分区结构相对应,如果不这样会报错,例如:
3、添加分区
www.2cto.com
当我们需要新添加分区的时候,我们需要修改分区方案,比如现在我们到了2005年年初,我们需要为2005年的交易记录准备分区,就需要添加分区:
USE [master]
GO
ALTER DATABASE [Sales] ADD FILEGROUP [FG4]
GO
ALTER DATABASE [Sales] ADD FILE ( NAME = N'File4', FILENAME = N'G:\data\FG4\File4.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG4]
GO
我们新建立了一个文件组,然我们同样按照上面的方法,进行修改分区函数和方案:
use Sales
go
alter partition scheme ps_OrderDate next used [FG4]
alter partition function pf_OrderDate() split range('2005/01/01')
go
我们这里用alter partition Scheme ps_OrderDate Next Used FG4用来指定新分区的数据在那个文件。这里Next Used FG4指定的就是我们刚才新建立的第四个文件组。当然我们可以放在原来已经建立的文件组,为了防治数据混乱存放我们大部分是新建立文件组。
alter partition function pf_OrderDate() split range('2005/01/01')代表我么创建一个新分区,而这里split range是创建新分区的关键语法。
至此,我们就有了四个分区,此时的区间如下:
文件组 分区 取值范围
FG1 1 (过去某年, 2003/01/01)
FG2 2 [2003/01/01, 2004/01/01)
FG3 3 [2004/01/01,2005/01/01]
FG4 4 [2004/01/01,未来某年)
www.2cto.com
4、删除分区
删除分区又称合并分区,简单讲就是两个分区的数据进行合并,比如我们想合并2002年的分区和2003年的分区到一个分区,我们可以用如下的代码:
use Sales
go
alter partition function pf_OrderDate() merge range('2003/01/01')
go
也就是将2003年这个分区点去掉,里面分区里面的数据会自动合并到一起。
执行完上面的代码,此时分区区间如下:
文件组 分区 取值范围
Fg2 1 [过去某年, 2004/01/01)
Fg3 2 [2004/01/01, 2005/01/01)
Fg2 3 [2005/01/01, 未来某年)
合并2002和2003年的数据到2003年之后,我们执行如下代码:
SELECT Sales.$PARTITION.pf_OrderDate('2003')
你会发现返回的结果是1。而原来返回的是2,原因是2002年以前数据所在的那个分区合并到了2003年这个分区中了。
此时我们执行下面代码: