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