分区表应用例子

引用联机帮助的说明:

      通过对表或索引进行分区,快速有效地移动数据子集。
      如果需要定期向已分区表添加新数据以及从同一已分区表中删除旧数据,可以使用这些方案。此操作会涉及各种方案中的大量或少量数据。如果必须加载、清除或转换要添加的新数据,则在将新数据作为分区添加之前可以将其视为独立的实体。可以将旧数据存档或存入数据仓库。无论集合有多大,都能快速有效地进行传输,因为并不以物理方式移动数据,这与 INSERT INTO SELECT FROM 语句不同。只有关于存储位置的元数据会从一个分区变为另一个分区。
      
在我们实际中,可以应用于出粮系统,考勤系统,已处理订单系统等。插入当月数据的时候,需要把上月的数据放到历史的数据表中,使用表分区方法就很好的能实现。




Use  test
go
If   Object_id ( ' Duty ' Is   Not   null  
    
Drop   Table  Duty
Go
If   Object_id ( ' DutyHistory ' Is   Not   null  
    
Drop   Table  DutyHistory
Go

If   Exists ( Select   1   From  sys.partition_schemes  Where  name = ' MyPS1 ' )
    
Drop  Partition scheme MyPS1
Go
If   Exists ( Select   1   From  sys.partition_functions  Where  name = ' MyPF1 ' )
    
Drop  Partition  Function  MyPF1
Go

-- 建立分区函数
Create  Partition  Function  MyPF1( datetime )
As  Range  Left
For   Values ( ' 2007/12/31 ' )
Go
-- 建立分区方案

Create  Partition Scheme MyPS1
As  Partition MyPF1
To  ( [ Primary ] , [ Primary ] )
Go
/*
1,建立分区函数,分区方案是有先后顺序的。
2,分区函数提供的值的数目n,不能超过 999。所创建的分区数等于 n + 1
*/
Go
-- 建立测试表
Create   Table  Duty(
        id 
int   Identity ( 1 , 1 Not   Null ,
        Name 
nvarchar ( 50 ),
        WorkDate 
datetime ,
        WorkHours numeric(
5 , 1 ),
        
Constraint  PK_Duty  Primary   Key   Clustered (id  Asc ,WorkDate  Asc On  MyPS1(WorkDate)
)
On  MyPS1(WorkDate)
Go
Create   Table  DutyHistory(
        id 
int   Identity ( 1 , 1 Not   Null ,
        Name 
nvarchar ( 50 ),
        WorkDate 
datetime ,
        WorkHours numeric(
5 , 1 ),
        
Constraint  PK_DutyHistory  Primary   Key   Clustered (id  Asc ,WorkDate  Asc On  MyPS1(WorkDate)
)
On  MyPS1(WorkDate)

-- 这里就是用到了表分区方案。
Go
-- 插入2008/1一个月的数据
Declare  
        
@MaxRows   int ,
        
@StartDate   datetime

Select  
    
@MaxRows = 31 ,
    
@StartDate = ' 2007/12/31 '
    
;
With  
a0 
as ( Select  id = 1   Union   All   Select  id = 1 ),
a1 
as ( Select  id = a.id  From  a0 a,a0 b),
a2 
as ( Select  id = a.id  From  a1 a,a1 b),
a3 
as ( Select  id = a.id  From  a2 a,a2 b),
a4 
as ( Select  id = a.id  From  a3 a,a3 b),
a5 
as ( Select  id = a.id  From  a4 a,a4 b),
Row 
as ( Select  id = Row_number()  Over ( Order   By  id)  From  a5)
Insert   Into  Duty 
    (
[ name ] ,WorkDate,WorkHours)
Select   ' Robert ' , @StartDate + id, Rand () * 6   From  Row  Where  id <= @MaxRows
/*
--debug 查询两表的分区情况
Select * from sys.partitions 
Where object_id In(Select object_id From sys.tables Where name In('Duty','DutyHistory'))
*/
Go
-- 切换分区前
Select   *   From  Duty
Select   *   From  DutyHistory
-- 切换分区 Duty -->DutyHistory 
Alter   Table  Duty Switch Partition  2   To  DutyHistory Partition  2
-- 切换分区后
Select   *   From  Duty
Select   *   From  DutyHistory

Go
-- 修改分区函数,分区方案,方便下个月切换分区

-- 1.把>2007/12/31的分区拆分为两个分区
Alter  Partition Scheme MyPS1 
Next  Used  [ Primary ]  
Go
Alter  Partition  Function  MyPF1()
Split Range(
' 2008/1/31 '
Go
-- 2.把<2008/1/31的两个分区合并
Alter  Partition  Function  MyPF1()
Merge Range(
' 2007/12/31 '
Go
-- 插入2月份数据
Declare  
        
@MaxRows   int ,
        
@StartDate   datetime

Select  
    
@MaxRows = 29 ,
    
@StartDate = ' 2008/1/31 '
    
;
With  
a0 
as ( Select  id = 1   Union   All   Select  id = 1 ),
a1 
as ( Select  id = a.id  From  a0 a,a0 b),
a2 
as ( Select  id = a.id  From  a1 a,a1 b),
a3 
as ( Select  id = a.id  From  a2 a,a2 b),
a4 
as ( Select  id = a.id  From  a3 a,a3 b),
a5 
as ( Select  id = a.id  From  a4 a,a4 b),
Row 
as ( Select  id = Row_number()  Over ( Order   By  id)  From  a5)
Insert   Into  Duty 
    (
[ name ] ,WorkDate,WorkHours)
Select   ' Robert ' , @StartDate + id, Rand () * 6   From  Row  Where  id <= @MaxRows

Go
-- 切换分区前
Select   *   From  Duty
Select   *   From  DutyHistory
-- 切换分区 Duty -->DutyHistory 
Alter   Table  Duty Switch Partition  2   To  DutyHistory Partition  2
-- 切换分区后
Select   *   From  Duty
Select   *   From  DutyHistory


你可能感兴趣的:(分区表)