1. -- 进行演示操作前, 先备份, 以便可以在演示完成后, 恢复到原始状态  
  2. USE master  
  3. -- 备份  
  4. BACKUP DATABASE AdventureWorks  
  5.     TO DISK = 'AdventureWorks.bak'  
  6.     WITH FORMAT   
  7.   
  8.    
  9.   
  10. ---- 恢复  
  11. --RESTORE DATABASE AdventureWorks  
  12. --    FROM DISK = 'AdventureWorks.bak'  
  13. --    WITH REPLACE  
  14. GO  
  15.   
  16. --=========================================  
  17. -- 转换为分区表  
  18. --=========================================  
  19. USE AdventureWorks  
  20. GO  
  21.   
  22. -- 1. 创建分区函数  
  23. --    a. 适用于存储历史存档记录的分区表的分区函数  
  24. DECLARE @dt datetime  
  25. SET @dt = '20020101'  
  26. CREATE PARTITION FUNCTION PF_HistoryArchive(datetime)  
  27. AS RANGE RIGHT  
  28. FOR VALUES(  
  29.     @dt,  
  30.     DATEADD(Year, 1, @dt))  
  31.   
  32. --    b. 适用于存储历史记录的分区表的分区函数  
  33. --DECLARE @dt datetime  
  34. SET @dt = '20030901'  
  35. CREATE PARTITION FUNCTION PF_History(datetime)  
  36. AS RANGE RIGHT  
  37. FOR VALUES(  
  38.     @dt,  
  39.     DATEADD(Month, 1, @dt), DATEADD(Month, 2, @dt), DATEADD(Month, 3, @dt),  
  40.     DATEADD(Month, 4, @dt), DATEADD(Month, 5, @dt), DATEADD(Month, 6, @dt),  
  41.     DATEADD(Month, 7, @dt), DATEADD(Month, 8, @dt), DATEADD(Month, 9, @dt),  
  42.     DATEADD(Month, 10, @dt), DATEADD(Month, 11, @dt), DATEADD(Month, 12, @dt))  
  43. GO  
  44.   
  45. -- 2. 创建分区架构  
  46. --    a. 适用于存储历史存档记录的分区表的分区架构  
  47. CREATE PARTITION SCHEME PS_HistoryArchive  
  48. AS PARTITION PF_HistoryArchive  
  49. TO([PRIMARY], [PRIMARY], [PRIMARY])  
  50.   
  51. --    b. 适用于存储历史记录的分区表的分区架构  
  52. CREATE PARTITION SCHEME PS_History  
  53. AS PARTITION PF_History  
  54. TO([PRIMARY], [PRIMARY],  
  55.     [PRIMARY], [PRIMARY], [PRIMARY],  
  56.     [PRIMARY], [PRIMARY], [PRIMARY],  
  57.     [PRIMARY], [PRIMARY], [PRIMARY],  
  58.     [PRIMARY], [PRIMARY], [PRIMARY])  
  59. GO  
  60.   
  61. -- 3. 删除索引  
  62. --    a. 删除存储历史存档记录的表中的索引  
  63. DROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ProductID  
  64. DROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID  
  65.   
  66. --    b. 删除存储历史记录的表中的索引  
  67. DROP INDEX Production.TransactionHistory.IX_TransactionHistory_ProductID  
  68. DROP INDEX Production.TransactionHistory.IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID  
  69. GO  
  70.   
  71. -- 4. 转换为分区表  
  72. --    a. 将存储历史存档记录的表转换为分区表  
  73. ALTER TABLE Production.TransactionHistoryArchive  
  74.     DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID  
  75.     WITH(  
  76.         MOVE TO PS_HistoryArchive(TransactionDate))  
  77.   
  78. --    b.将存储历史记录的表转换为分区表  
  79. ALTER TABLE Production.TransactionHistory  
  80.     DROP CONSTRAINT PK_TransactionHistory_TransactionID  
  81.     WITH(  
  82.         MOVE TO PS_History(TransactionDate))  
  83. GO  
  84.   
  85. -- 5. 恢复主键  
  86. --    a. 恢复存储历史存档记录的分区表的主键  
  87. ALTER TABLE Production.TransactionHistoryArchive  
  88.     ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID  
  89.         PRIMARY KEY CLUSTERED(  
  90.             TransactionID,  
  91.             TransactionDate)  
  92.   
  93. --    b. 恢复存储历史记录的分区表的主键  
  94. ALTER TABLE Production.TransactionHistory  
  95.     ADD CONSTRAINT PK_TransactionHistory_TransactionID  
  96.         PRIMARY KEY CLUSTERED(  
  97.             TransactionID,  
  98.             TransactionDate)  
  99. GO  
  100.   
  101. -- 6. 恢复索引  
  102. --    a. 恢复存储历史存档记录的分区表的索引  
  103. CREATE INDEX IX_TransactionHistoryArchive_ProductID  
  104.     ON Production.TransactionHistoryArchive(  
  105.         ProductID)  
  106.   
  107. CREATE INDEX IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID  
  108.     ON Production.TransactionHistoryArchive(  
  109.         ReferenceOrderID,  
  110.         ReferenceOrderLineID)  
  111.   
  112. --    b. 恢复存储历史记录的分区表的索引  
  113. CREATE INDEX IX_TransactionHistory_ProductID  
  114.     ON Production.TransactionHistory(  
  115.         ProductID)  
  116.   
  117. CREATE INDEX IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID  
  118.     ON Production.TransactionHistory(  
  119.         ReferenceOrderID,  
  120.         ReferenceOrderLineID)  
  121. GO  
  122.   
  123. -- 7. 查看分区表的相关信息  
  124. SELECT  
  125.     SchemaName = S.name,  
  126.     TableName = TB.name,  
  127.     PartitionScheme = PS.name,  
  128.     PartitionFunction = PF.name,  
  129.     PartitionFunctionRangeType = CASE  
  130.             WHEN boundary_value_on_right = 0 THEN 'LEFT'  
  131.             ELSE 'RIGHT' END,  
  132.     PartitionFunctionFanout = PF.fanout,  
  133.     SchemaID = S.schema_id,  
  134.     ObjectID = TB.object_id,  
  135.     PartitionSchemeID = PS.data_space_id,  
  136.     PartitionFunctionID = PS.function_id  
  137. FROM sys.schemas S  
  138.     INNER JOIN sys.tables TB  
  139.         ON S.schema_id = TB.schema_id  
  140.     INNER JOIN sys.indexes IDX  
  141.         on TB.object_id = IDX.object_id  
  142.             AND IDX.index_id < 2  
  143.     INNER JOIN sys.partition_schemes PS  
  144.         ON PS.data_space_id = IDX.data_space_id  
  145.     INNER JOIN sys.partition_functions PF  
  146.         ON PS.function_id = PF.function_id  
  147. GO  
  148.   
  149. --=========================================  
  150. -- 移动分区表数据  
  151. --=========================================  
  152. -- 1. 为存储历史存档记录的分区表增加分区, 并接受从历史记录分区表移动过来的数据  
  153. --    a. 修改分区架构, 增加用以接受新分区的文件组  
  154. ALTER PARTITION SCHEME PS_HistoryArchive  
  155. NEXT USED [PRIMARY]  
  156.   
  157. --    b. 修改分区函数, 增加分区用以接受从历史记录分区表移动过来的数据  
  158. DECLARE @dt datetime  
  159. SET @dt = '20030901'  
  160. ALTER PARTITION FUNCTION PF_HistoryArchive()  
  161. SPLIT RANGE(@dt)  
  162.   
  163. --    c. 将历史记录表中的过期数据移动到历史存档记录表中  
  164. ALTER TABLE Production.TransactionHistory  
  165.     SWITCH PARTITION 2  
  166.         TO Production.TransactionHistoryArchive PARTITION $PARTITION.PF_HistoryArchive(@dt)  
  167.   
  168. --    d. 将接受到的数据与原来的分区合并  
  169. ALTER PARTITION FUNCTION PF_HistoryArchive()  
  170. MERGE RANGE(@dt)  
  171. GO  
  172.   
  173. -- 2. 将存储历史记录的分区表中不包含数据的分区删除, 并增加新的分区以接受新数据  
  174. --    a. 合并不包含数据的分区  
  175. DECLARE @dt datetime  
  176. SET @dt = '20030901'  
  177. ALTER PARTITION FUNCTION PF_History()  
  178. MERGE RANGE(@dt)  
  179.   
  180. --    b.  修改分区架构, 增加用以接受新分区的文件组  
  181. ALTER PARTITION SCHEME PS_History  
  182. NEXT USED [PRIMARY]  
  183.   
  184. --    c. 修改分区函数, 增加分区用以接受新数据  
  185. SET @dt = '20041001'  
  186. ALTER PARTITION FUNCTION PF_History()  
  187. SPLIT RANGE(@dt)  
  188. GO  
  189.   
  190. --=========================================  
  191. -- 清除历史存档记录中的过期数据  
  192. --=========================================  
  193. -- 1. 创建用于保存过期的历史存档数据的表  
  194. CREATE TABLE Production.TransactionHistoryArchive_2001_temp(  
  195.     TransactionID int NOT NULL,  
  196.     ProductID int NOT NULL,  
  197.     ReferenceOrderID int NOT NULL,  
  198.     ReferenceOrderLineID int NOT NULL  
  199.         DEFAULT ((0)),  
  200.     TransactionDate datetime NOT NULL  
  201.         DEFAULT (GETDATE()),  
  202.     TransactionType nchar(1) NOT NULL,  
  203.     Quantity int NOT NULL,  
  204.     ActualCost money NOT NULL,  
  205.     ModifiedDate datetime NOT NULL  
  206.         DEFAULT (GETDATE()),  
  207.     CONSTRAINT PK_TransactionHistoryArchive_2001_temp_TransactionID  
  208.         PRIMARY KEY CLUSTERED(  
  209.             TransactionID,  
  210.             TransactionDate)  
  211. )  
  212.   
  213. -- 2. 将数据从历史存档记录分区表移动到第1步创建的表中  
  214. ALTER TABLE Production.TransactionHistoryArchive  
  215.     SWITCH PARTITION 1  
  216.         TO Production.TransactionHistoryArchive_2001_temp  
  217.   
  218. -- 3. 删除不再包含数据的分区  
  219. DECLARE @dt datetime  
  220. SET @dt = '20020101'  
  221. ALTER PARTITION FUNCTION PF_HistoryArchive()  
  222. MERGE RANGE(@dt)  
  223.   
  224. -- 4. 修改分区架构, 增加用以接受新分区的文件组  
  225. ALTER PARTITION SCHEME PS_HistoryArchive  
  226. NEXT USED [PRIMARY]  
  227.   
  228. -- 5. 修改分区函数, 增加分区用以接受新数据  
  229. SET @dt = '20040101'  
  230. ALTER PARTITION FUNCTION PF_HistoryArchive()  
  231. SPLIT RANGE(@dt)  
  232.   
  233.   
  234. 查询分区信息:  
  235.   
  236. ;WITH  
  237. TBINFO AS(  
  238.     SELECT  
  239.         SchemaName = S.name,  
  240.         TableName = TB.name,  
  241.         PartitionScheme = PS.name,  
  242.         PartitionFunction = PF.name,  
  243.         PartitionFunctionRangeType = CASE  
  244.                 WHEN boundary_value_on_right = 0 THEN 'LEFT'  
  245.                 ELSE 'RIGHT' END,  
  246.         PartitionFunctionFanout = PF.fanout,  
  247.         SchemaID = S.schema_id,  
  248.         ObjectID = TB.object_id,  
  249.         PartitionSchemeID = PS.data_space_id,  
  250.         PartitionFunctionID = PS.function_id  
  251.     FROM sys.schemas S  
  252.         INNER JOIN sys.tables TB  
  253.             ON S.schema_id = TB.schema_id  
  254.         INNER JOIN sys.indexes IDX  
  255.             on TB.object_id = IDX.object_id  
  256.                 AND IDX.index_id < 2  
  257.         INNER JOIN sys.partition_schemes PS  
  258.             ON PS.data_space_id = IDX.data_space_id  
  259.         INNER JOIN sys.partition_functions PF  
  260.             ON PS.function_id = PF.function_id  
  261. ),  
  262. PF1 AS(  
  263.     SELECT PFP.function_id, PFR.boundary_id, PFR.value, Type = CONVERT(sysname,  
  264.             CASE T.name  
  265.                 WHEN 'numeric' THEN 'decimal'  
  266.                 WHEN 'real' THEN 'float'  
  267.                 ELSE T.name END  
  268.             + CASE  
  269.                 WHEN T.name IN('decimal', 'numeric')  
  270.                     THEN QUOTENAME(RTRIM(PFP.precision)  
  271.                         + CASE WHEN PFP.scale > 0 THEN ',' + RTRIM(PFP.scale) ELSE '' END, '()')  
  272.                 WHEN T.name IN('float', 'real')  
  273.                     THEN QUOTENAME(PFP.precision, '()')  
  274.                 WHEN T.name LIKE 'n%char'  
  275.                     THEN QUOTENAME(PFP.max_length / 2, '()')  
  276.                 WHEN T.name LIKE '%char' OR T.name LIKE '%binary'  
  277.                     THEN QUOTENAME(PFP.max_length, '()')  
  278.                 ELSE '' END)  
  279.     FROM sys.partition_parameters PFP  
  280.         LEFT JOIN sys.partition_range_values PFR  
  281.             ON PFR.function_id = PFP.function_id  
  282.                 AND PFR.parameter_id = PFP.parameter_id  
  283.         INNER JOIN sys.types T  
  284.             ON PFP.system_type_id = T.system_type_id  
  285. ),  
  286. PF2 AS(  
  287.     SELECT * FROM PF1  
  288.     UNION ALL  
  289.     SELECT  
  290.         function_id, boundary_id = boundary_id - 1, value, type  
  291.     FROM PF1  
  292.     WHERE boundary_id = 1  
  293. ),  
  294. PF AS(  
  295.     SELECT  
  296.         B.function_id, boundary_id = ISNULL(B.boundary_id + 1, 1),  
  297.         value = STUFF(  
  298.             CASE  
  299.                 WHEN A.boundary_id IS NULL THEN ''  
  300.                 ELSE ' AND [partition_column_name] ' + PF.LessThan + ' ' + CONVERT(varchar(max), A.value) END  
  301.             + CASE  
  302.                 WHEN A.boundary_id = 1 THEN ''  
  303.                 ELSE ' AND [partition_column_name] ' + PF.MoreThan + ' ' + CONVERT(varchar(max), B.value) END,  
  304.             1, 5, ''),  
  305.         B.Type  
  306.     FROM PF1 A         
  307.         RIGHT JOIN PF2 B  
  308.             ON A.function_id = B.function_id  
  309.                 AND (A.boundary_id - 1 = B.boundary_id  
  310.                     OR(A.boundary_id IS NULL AND B.boundary_id IS NULL))  
  311.         INNER JOIN(  
  312.             SELECT  
  313.                 function_id,  
  314.                 LessThan = CASE  
  315.                         WHEN boundary_value_on_right = 0 THEN '<='  
  316.                         ELSE '<' END,  
  317.                 MoreThan = CASE  
  318.                         WHEN boundary_value_on_right = 0 THEN '>'  
  319.                         ELSE '>=' END  
  320.             FROM sys.partition_functions  
  321.         )PF  
  322.             ON B.function_id = PF.function_id  
  323. ),  
  324. PS AS(  
  325.     SELECT  
  326.         DDS.partition_scheme_id, DDS.destination_id,  
  327.         FileGroupName = FG.name, IsReadOnly = FG.is_read_only  
  328.     FROM sys.destination_data_spaces DDS  
  329.         INNER JOIN sys.filegroups FG  
  330.             ON DDS.data_space_id = FG.data_space_id  
  331. ),  
  332. PINFO AS(  
  333.     SELECT  
  334.         RowID = ROW_NUMBER() OVER(ORDER BY SchemaID, ObjectID, PS.destination_id),  
  335.         TB.SchemaName, TB.TableName,  
  336.         TB.PartitionScheme, PS.destination_id, PS.FileGroupName, PS.IsReadOnly,  
  337.         TB.PartitionFunction, TB.PartitionFunctionRangeType, TB.PartitionFunctionFanout,  
  338.         PF.boundary_id, PF.Type, PF.value  
  339.     FROM TBINFO TB  
  340.         INNER JOIN PS  
  341.             ON TB.PartitionSchemeID = PS.partition_scheme_id  
  342.         LEFT JOIN PF  
  343.             ON TB.PartitionFunctionID = PF.function_id  
  344.                 AND PS.destination_id = PF.boundary_id  
  345. )  
  346. SELECT  
  347.     RowID,  
  348.     SchemaName = CASE destination_id  
  349.             WHEN 1 THEN SchemaName  
  350.             ELSE N'' END,  
  351.     TableName = CASE destination_id  
  352.             WHEN 1 THEN TableName  
  353.             ELSE N'' END,  
  354.     PartitionScheme = CASE destination_id  
  355.             WHEN 1 THEN PartitionScheme  
  356.             ELSE N'' END,  
  357.     destination_id, FileGroupName, IsReadOnly,  
  358.     PartitionFunction = CASE destination_id  
  359.             WHEN 1 THEN PartitionFunction  
  360.             ELSE N'' END,  
  361.     PartitionFunctionRangeType = CASE destination_id  
  362.             WHEN 1 THEN PartitionFunctionRangeType  
  363.             ELSE N'' END,  
  364.     PartitionFunctionFanout = CASE destination_id  
  365.             WHEN 1 THEN CONVERT(varchar(20), PartitionFunctionFanout)  
  366.             ELSE N'' END,  
  367.     boundary_id = ISNULL(CONVERT(varchar(20), boundary_id), ''),  
  368.     Type = ISNULL(Type, N''),  
  369.     value = CASE PartitionFunctionFanout  
  370.             WHEN 1 THEN '<ALL Data>'  
  371.             ELSE ISNULL(value, N'<NEXT USED>') END  
  372. FROM PINFO  
  373. ORDER BY RowID  
  374.   
  375.    
  376.   
  377.   
  378. --==================================  
  379. --drop database dbPartitionTest  
  380.   --测试数据库  
  381.   create database dbPartitionTest  
  382.   go  
  383.   use  
  384.    dbPartitionTest  
  385.   go  
  386.   --增加分组  
  387.   alter database dbPartitionTest ADD FILEGROUP P200801  
  388.   alter database dbPartitionTest ADD FILEGROUP P200802  
  389.   alter database dbPartitionTest ADD FILEGROUP P200803  
  390.   go  
  391.   --分区函数  
  392.   CREATE PARTITION FUNCTION part_Year(datetime)  
  393.   AS RANGE LEFT FOR VALUES  
  394.   (  
  395.   ’20080131 23:59:59.997’,’20080229 23:59:59.997’,’20080331 23:59:59.997’  
  396.   )  
  397.   go  
  398.   --增加文件组  
  399.   ALTER DATABASE dbPartitionTest ADD FILE (NAME = N’P200801’,FILENAME = N’c:tb_P200801.ndf’,SIZE = 1MB,MAXSIZE = 500MB,FILEGROWTH = 1MB)TO FILEGROUP P200801  
  400.   ALTER DATABASE dbPartitionTest ADD FILE (NAME = N’P200802’,FILENAME = N’c:tb_P200802.ndf’,SIZE = 1MB,MAXSIZE = 500MB,FILEGROWTH = 1MB)TO FILEGROUP P200802  
  401.   ALTER DATABASE dbPartitionTest ADD FILE (NAME = N’P200803’,FILENAME = N’c:tb_P200803.ndf’,SIZE = 1MB,MAXSIZE = 500MB,FILEGROWTH = 1MB)TO FILEGROUP P200803  
  402.   go  
  403.   --分区架构  
  404.   CREATE PARTITION SCHEME part_YearScheme AS PARTITION part_Year  TO (P200801,P200802,P200803,[PRIMARY])  
  405.   go  
  406.   CREATE TABLE [dbo].t_part  
  407.   (name varchar(100) default newid(),date datetime NOT NULL)  
  408.   ON part_YearScheme (date)  
  409.   go  
  410.   --添加测试数据,每天1条  
  411.   declare @date datetime  
  412.   set @date=’2007-12-31’  
  413.   while @date<=’2008-04-0’  
  414.   begin  
  415.   insert into t_part(date)values(@date)  
  416.   set @date=@date+1  
  417.   end  
  418.   go  
  419.   --查询数据分布在哪些分区  
  420.   select $partition.part_Year(date) as 分区编号,* from t_part order by date  
  421.   --查询数据库文件  
  422.   go  
  423.   sp_helpfile  
  424.   
  425.    
posted on 2014-10-15 21:15  小光zfg  阅读(287)  评论(0)    收藏  举报