SQL Server 2005 分区表实践——滑动窗口方案

[作/译者]:鹏城万里    [日期]:2008-07-15    [来源]:本站原创    [查看]: 1494

【鹏城万里】 发表于 www.sqlstudy.com

SQL Server 2005 分区表——滑动窗口方案实践:采用滑动窗口机制,把分区表的分区依次移入到另一个分区表。值得一提的是,本文示例涉及了 SQL 分区表的方方面面:建立分区函数(partition function)、分区方案(partition scheme);分区表创建;分区函数拆分、合并;分区表分区切换(partition swtich);分区索引(partition index)等诸多内容。

建立分区表 Orders
drop table dbo.Orders
go

drop partition scheme PS_Orders
go

drop partition function PF_Orders_OrderDateRange
go


-- 创建分区函数
create partition function PF_Orders_OrderDateRange(datetime)
as
range right for values (
'1996-01-01',
'1997-01-01',
'1998-01-01',
'1999-01-01'
)
go

-- 创建分区方案
create partition scheme PS_Orders
as
partition PF_Orders_OrderDateRange
all to ([primary])
go


-- 创建分区表
create table dbo.Orders
(
   OrderID     int          not null
  ,CustomerID  varchar(10)  not null
  ,EmployeeID  int          not null
  ,OrderDate   datetime     not null
)
on PS_Orders(OrderDate)
go

-- 创建聚集分区索引
create clustered index IXC_Orders_OrderDate on dbo.Orders(OrderDate)
go

-- 为分区表设置主键
alter table dbo.Orders add constraint PK_Orders primary key (OrderID, CustomerID, OrderDate)
go

-- 导入数据到分区表
insert into dbo.Orders
select OrderID, CustomerID, EmployeeID, OrderDate
  from dbo.Orders_From_SQL2000_Northwind   --(注:数据来源于 SQL Server 2000 示例数据库)
go
建立分区表 OrdersArchive (用来归档 Orders 表中不再活跃的数据)
drop table OrdersArchive
go

drop partition scheme PS_OrdersArchive
go

drop partition function PF_OrdersArchive_OrderDateRange
go

-- 创建分区函数
create partition function PF_OrdersArchive_OrderDateRange(datetime)
as
range right for values (
'1996-01-01',
'1997-01-01'
)
go

-- 创建分区方案
create partition scheme PS_OrdersArchive
as
partition PF_OrdersArchive_OrderDateRange
all to ([primary])
go

-- 创建分区表
create table dbo.OrdersArchive
(
   OrderID     int          not null
  ,CustomerID  varchar(10)  not null
  ,EmployeeID  int          not null
  ,OrderDate   datetime     not null
)
on PS_OrdersArchive(OrderDate)
go

-- 创建聚集分区索引
create clustered index IXC_OrdersArchive_OrderDate on dbo.OrdersArchive(OrderDate)
go

-- 为分区表设置主键
alter table dbo.OrdersArchive add constraint PK_OrdersArchive
   primary key (OrderID, CustomerID, OrderDate)
go
查看分区表分区函数的分区范围
exec dbo.sp_partition_range 'dbo.Orders'
go

exec dbo.sp_partition_ragne 'dbo.OrdersArchive'
go

获取 dbo.sp_partition_range sp_partition_range代码

查看分区表每个分区的数据分布情况
-- 查看分区表 Orders 每个分区的数据分布情况
select partition = $partition.PF_Orders_OrderDateRange(OrderDate)
      ,rows      = count(*)
      ,minval    = min(OrderDate)
      ,maxval    = max(OrderDate)
  from dbo.Orders
 group by $partition.PF_Orders_OrderDateRange(OrderDate)
 order by partition
go

-- 查看分区表 OrdersArchive 每个分区的数据分布情况
select partition = $partition.PF_OrdersArchive_OrderDateRange(OrderDate)
      ,rows      = count(*)
      ,minval    = min(OrderDate)
      ,maxval    = max(OrderDate)
  from dbo.OrdersArchive
 group by $partition.PF_OrdersArchive_OrderDateRange(OrderDate)
 order by partition
运用滑动窗口机制,把分区表 Orders 分区数据迁移入 OrdersArchive

窗口滑动的步骤: 1. 在 OrdersArchive 分区表增加一个空闲分区。 2. 移动 Orders 一个分区到相应的 OrdersArchive 分区。 3. 删除 Orders 中的空闲分区。

移动订单日期为 1996 年的分区数据:

-- 为 OrderArchive 分区表的新增分区,指定存放位置。
alter partition scheme PS_OrdersArchive next used [primary]
go

-- 在 OrderArchive 新增一个分区(用来存放 1997 年数据)
alter partition function PF_OrdersArchive_OrderDateRange()
split range('1998-01-01')
go

-- 移动 Orders 1996 年数据到 OrderArchive
alter table dbo.Orders switch partition 2 to dbo.OrdersArchive partition 2
go

-- 合并 Orders 空闲分区(1996 年数据)
alter partition function PF_Orders_OrderDateRange()
merge range('1996-01-01')
go

移动订单日期为 1997 年的分区数据:

-- 为 OrderArchive 分区表的新增分区,指定存放位置。
alter partition scheme PS_OrdersArchive next used [primary]
go

-- 在 OrderArchive 新增一个分区(用来存放 1998 年数据)
alter partition function PF_OrdersArchive_OrderDateRange()
split range('1999-01-01')
go

-- 移动 Orders 1996 年数据到 OrderArchive
alter table dbo.Orders switch partition 2 to dbo.OrdersArchive partition 3
go

-- 合并 Orders 空闲分区(1997 年数据)
alter partition function PF_Orders_OrderDateRange()
merge range('1997-01-01')
go

移动订单日期为 1998 年的分区数据:

-- 为 OrderArchive 分区表的新增分区,指定存放位置。
alter partition scheme PS_OrdersArchive next used [primary]
go

-- 在 OrderArchive 新增一个分区(用来存放 1999 年数据)
alter partition function PF_OrdersArchive_OrderDateRange()
split range('2000-01-01')
go

-- 移动 Orders 1996 年数据到 OrderArchive
alter table dbo.Orders switch partition 2 to dbo.OrdersArchive partition 4
go

-- 合并 Orders 空闲分区(1998 年数据)
alter partition function PF_Orders_OrderDateRange()
merge range('1998-01-01')
go

经过以上三次移动,我们已经把分区表 Orders 中的数据全部移动到 OrdersArchive 中了。同时我们注意到:在这个窗口滑动过程中,代码中只有三处是变化的(有规律): “split range('2000-01-01')”。 “merge range('1998-01-01')”。 “to dbo.OrdersArchive partition 4”。这就为程序化处理,提供了条件。

 

本文由 www.sqlstudy.com 原创,版权所有,转载请注明作者和出处!

本文链接:http://www.sqlstudy.com/sql_article.php?id=2008071501

你可能感兴趣的:(数据库)