SqlServer2005数据库分区

扶醉桌前 提交于 2020-03-17 13:55:20

转载出处: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(Year1@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(Month1@dt), DATEADD(Month2@dt), DATEADD(Month3@dt),
 38     DATEADD(Month4@dt), DATEADD(Month5@dt), DATEADD(Month6@dt),
 39     DATEADD(Month7@dt), DATEADD(Month8@dt), DATEADD(Month9@dt),
 40     DATEADD(Month10@dt), DATEADD(Month11@dt), DATEADD(Month12@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(1NOT 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 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!