SqlServer2005数据库分区

转载出处:http://blog.csdn.net/doyouknowm/archive/2009/08/20/4466072.aspx

 

 

  1  --  进行演示操作前, 先备份, 以便可以在演示完成后, 恢复到原始状态
  2  USE  master
  3  --  备份
  4  BACKUP   DATABASE  AdventureWorks
  5       TO   DISK   =   ' AdventureWorks.bak '
  6       WITH  FORMAT
  7 
  8  -- -- 恢复
  9  -- RESTORE DATABASE AdventureWorks
 10  --     FROM DISK = 'AdventureWorks.bak'
 11  --     WITH REPLACE
 12  GO
 13 
 14  -- =========================================
 15  --  转换为分区表
 16  -- =========================================
 17  USE  AdventureWorks
 18  GO
 19 
 20  --  1. 创建分区函数
 21  --     a. 适用于存储历史存档记录的分区表的分区函数
 22  DECLARE   @dt   datetime
 23  SET   @dt   =   ' 20020101 '
 24  CREATE  PARTITION  FUNCTION  PF_HistoryArchive( datetime )
 25  AS  RANGE  RIGHT
 26  FOR   VALUES (
 27       @dt
 28       DATEADD ( Year 1 @dt ))
 29 
 30  --     b. 适用于存储历史记录的分区表的分区函数
 31  -- DECLARE @dt datetime
 32  SET   @dt   =   ' 20030901 '
 33  CREATE  PARTITION  FUNCTION  PF_History( datetime )
 34  AS  RANGE  RIGHT
 35  FOR   VALUES (
 36       @dt
 37       DATEADD ( Month 1 @dt ),  DATEADD ( Month 2 @dt ),  DATEADD ( Month 3 @dt ),
 38       DATEADD ( Month 4 @dt ),  DATEADD ( Month 5 @dt ),  DATEADD ( Month 6 @dt ),
 39       DATEADD ( Month 7 @dt ),  DATEADD ( Month 8 @dt ),  DATEADD ( Month 9 @dt ),
 40       DATEADD ( Month 10 @dt ),  DATEADD ( Month 11 @dt ),  DATEADD ( Month 12 @dt ))
 41  GO
 42 
 43  --  2. 创建分区架构
 44  --     a. 适用于存储历史存档记录的分区表的分区架构
 45  CREATE  PARTITION SCHEME PS_HistoryArchive
 46  AS  PARTITION PF_HistoryArchive
 47  TO ( [ PRIMARY ] [ PRIMARY ] [ PRIMARY ] )
 48 
 49  --     b. 适用于存储历史记录的分区表的分区架构
 50  CREATE  PARTITION SCHEME PS_History
 51  AS  PARTITION PF_History
 52  TO ( [ PRIMARY ] [ PRIMARY ]
 53       [ PRIMARY ] [ PRIMARY ] [ PRIMARY ] ,
 54       [ PRIMARY ] [ PRIMARY ] [ PRIMARY ] ,
 55       [ PRIMARY ] [ PRIMARY ] [ PRIMARY ] ,
 56       [ PRIMARY ] [ PRIMARY ] [ PRIMARY ] )
 57  GO
 58 
 59  --  3. 删除索引
 60  --     a. 删除存储历史存档记录的表中的索引
 61  DROP   INDEX  Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ProductID
 62  DROP   INDEX  Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID
 63 
 64  --     b. 删除存储历史记录的表中的索引
 65  DROP   INDEX  Production.TransactionHistory.IX_TransactionHistory_ProductID
 66  DROP   INDEX  Production.TransactionHistory.IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID
 67  GO
 68 
 69  --  4. 转换为分区表
 70  --     a. 将存储历史存档记录的表转换为分区表
 71  ALTER   TABLE  Production.TransactionHistoryArchive
 72       DROP   CONSTRAINT  PK_TransactionHistoryArchive_TransactionID
 73       WITH (
 74          MOVE  TO  PS_HistoryArchive(TransactionDate))
 75 
 76  --     b.将存储历史记录的表转换为分区表
 77  ALTER   TABLE  Production.TransactionHistory
 78       DROP   CONSTRAINT  PK_TransactionHistory_TransactionID
 79       WITH (
 80          MOVE  TO  PS_History(TransactionDate))
 81  GO
 82 
 83  --  5. 恢复主键
 84  --     a. 恢复存储历史存档记录的分区表的主键
 85  ALTER   TABLE  Production.TransactionHistoryArchive
 86       ADD   CONSTRAINT  PK_TransactionHistoryArchive_TransactionID
 87           PRIMARY   KEY   CLUSTERED (
 88              TransactionID,
 89              TransactionDate)
 90 
 91  --     b. 恢复存储历史记录的分区表的主键
 92  ALTER   TABLE  Production.TransactionHistory
 93       ADD   CONSTRAINT  PK_TransactionHistory_TransactionID
 94           PRIMARY   KEY   CLUSTERED (
 95              TransactionID,
 96              TransactionDate)
 97  GO
 98 
 99  --  6. 恢复索引
100  --     a. 恢复存储历史存档记录的分区表的索引
101  CREATE   INDEX  IX_TransactionHistoryArchive_ProductID 
102       ON  Production.TransactionHistoryArchive(
103          ProductID)
104 
105  CREATE   INDEX  IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID
106       ON  Production.TransactionHistoryArchive(
107          ReferenceOrderID,
108          ReferenceOrderLineID)
109 
110  --     b. 恢复存储历史记录的分区表的索引
111  CREATE   INDEX  IX_TransactionHistory_ProductID 
112       ON  Production.TransactionHistory(
113          ProductID)
114 
115  CREATE   INDEX  IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID
116       ON  Production.TransactionHistory(
117          ReferenceOrderID,
118          ReferenceOrderLineID)
119  GO
120 
121  --  7. 查看分区表的相关信息
122  SELECT
123      SchemaName  =  S.name,
124      TableName  =  TB.name,
125      PartitionScheme  =  PS.name,
126      PartitionFunction  =  PF.name,
127      PartitionFunctionRangeType  =   CASE
128               WHEN  boundary_value_on_right  =   0   THEN   ' LEFT '
129               ELSE   ' RIGHT '   END ,
130      PartitionFunctionFanout  =  PF.fanout,
131      SchemaID  =  S.schema_id,
132      ObjectID  =  TB. object_id ,
133      PartitionSchemeID  =  PS.data_space_id,
134      PartitionFunctionID  =  PS.function_id
135  FROM  sys.schemas S
136       INNER   JOIN  sys.tables TB
137           ON  S.schema_id  =  TB.schema_id
138       INNER   JOIN  sys.indexes IDX
139           on  TB. object_id   =  IDX. object_id
140               AND  IDX.index_id  <   2
141       INNER   JOIN  sys.partition_schemes PS
142           ON  PS.data_space_id  =  IDX.data_space_id
143       INNER   JOIN  sys.partition_functions PF
144           ON  PS.function_id  =  PF.function_id
145  GO
146 
147  -- =========================================
148  --  移动分区表数据
149  -- =========================================
150  --  1. 为存储历史存档记录的分区表增加分区, 并接受从历史记录分区表移动过来的数据
151  --     a. 修改分区架构, 增加用以接受新分区的文件组
152  ALTER  PARTITION SCHEME PS_HistoryArchive
153  NEXT  USED  [ PRIMARY ]
154 
155  --     b. 修改分区函数, 增加分区用以接受从历史记录分区表移动过来的数据
156  DECLARE   @dt   datetime
157  SET   @dt   =   ' 20030901 '
158  ALTER  PARTITION  FUNCTION  PF_HistoryArchive()
159  SPLIT RANGE( @dt )
160 
161  --     c. 将历史记录表中的过期数据移动到历史存档记录表中
162  ALTER   TABLE  Production.TransactionHistory
163      SWITCH PARTITION  2
164           TO  Production.TransactionHistoryArchive PARTITION $PARTITION.PF_HistoryArchive( @dt )
165 
166  --     d. 将接受到的数据与原来的分区合并
167  ALTER  PARTITION  FUNCTION  PF_HistoryArchive()
168  MERGE RANGE( @dt )
169  GO
170 
171  --  2. 将存储历史记录的分区表中不包含数据的分区删除, 并增加新的分区以接受新数据
172  --     a. 合并不包含数据的分区
173  DECLARE   @dt   datetime
174  SET   @dt   =   ' 20030901 '
175  ALTER  PARTITION  FUNCTION  PF_History()
176  MERGE RANGE( @dt )
177 
178  --     b.  修改分区架构, 增加用以接受新分区的文件组
179  ALTER  PARTITION SCHEME PS_History
180  NEXT  USED  [ PRIMARY ]
181 
182  --     c. 修改分区函数, 增加分区用以接受新数据
183  SET   @dt   =   ' 20041001 '
184  ALTER  PARTITION  FUNCTION  PF_History()
185  SPLIT RANGE( @dt )
186  GO
187 
188 
189  -- =========================================
190  --  清除历史存档记录中的过期数据
191  -- =========================================
192  --  1. 创建用于保存过期的历史存档数据的表
193  CREATE   TABLE  Production.TransactionHistoryArchive_2001_temp(
194      TransactionID  int   NOT   NULL ,
195      ProductID  int   NOT   NULL ,
196      ReferenceOrderID  int   NOT   NULL ,
197      ReferenceOrderLineID  int   NOT   NULL
198           DEFAULT  (( 0 )),
199      TransactionDate  datetime   NOT   NULL
200           DEFAULT  ( GETDATE ()),
201      TransactionType  nchar ( 1 NOT   NULL ,
202      Quantity  int   NOT   NULL ,
203      ActualCost  money   NOT   NULL ,
204      ModifiedDate  datetime   NOT   NULL
205           DEFAULT  ( GETDATE ()),
206       CONSTRAINT  PK_TransactionHistoryArchive_2001_temp_TransactionID
207           PRIMARY   KEY   CLUSTERED (
208              TransactionID,
209              TransactionDate)
210  )
211 
212  --  2. 将数据从历史存档记录分区表移动到第1步创建的表中
213  ALTER   TABLE  Production.TransactionHistoryArchive
214      SWITCH PARTITION  1
215           TO  Production.TransactionHistoryArchive_2001_temp
216 
217  --  3. 删除不再包含数据的分区
218  DECLARE   @dt   datetime
219  SET   @dt   =   ' 20020101 '
220  ALTER  PARTITION  FUNCTION  PF_HistoryArchive()
221  MERGE RANGE( @dt )
222 
223  --  4. 修改分区架构, 增加用以接受新分区的文件组
224  ALTER  PARTITION SCHEME PS_HistoryArchive
225  NEXT  USED  [ PRIMARY ]
226 
227  --  5. 修改分区函数, 增加分区用以接受新数据
228  SET   @dt   =   ' 20040101 '
229  ALTER  PARTITION  FUNCTION  PF_HistoryArchive()
230  SPLIT RANGE( @dt )
231 
232 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值