代码
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)