• 表分区的操作三步走:


    1. 1.创建分区函数

      CREATE PARTITION FUNCTION xx1(int)

      解释:在当前数据库中创建一个函数,该函数可根据指定列的值将表或索引的各行映射到分区。

      语法:

      1
      2
      3
      4
      CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) 
      AS RANGE [ LEFT RIGHT ]  
      FOR VALUES ( [ boundary_value [ ,...n ] ] )  
      [ ; ]

        创建分区的范围:

      1
      AS RANGE LEFT FOR VALUES (10000, 20000);

      注释:创建分区函数:myRangePF2,以INT类型分区,分三个区间,10000以内在A 区,1W-2W在B区,2W以上在C区. 

      2.创建分区架构:

      1
      2
      3
      4
      5
      CREATE PARTITION SCHEME myRangePS2
       
      AS PARTITION xx1
       
      TO (a, b, c);

      注释:在分区函数XX1上创建分区架构:myRangePS2,分别为A,B,C三个区间

      A,B,C分别为三个文件组的名称,而且必须三个NDF隶属于这三个组,文件所属文件组一旦创建就不能修改

      3.对表进行分区

      1
      2
      3
      4
      5
      6
      7
      CREATE TABLE [dbo].[AvCache](
       
      [AVNote] [varchar](300) NULL,
       
      [bb] [int] IDENTITY(1,1)
       
      ON [myRangePS2](bb); --注意这里使用[myRangePS2]架构(即分区策略),根据bb分区
    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)  
  • 相关阅读:
    《编写可维护的JavaScript》之编程实践
    CSS基础知识之float
    tab.js分享及浏览器兼容性问题汇总
    CSS基础知识之position
    样式布局分享-基于frozen.js的移动OA
    DoNet开源项目-基于jQuery EasyUI的后台管理系统
    DoNet开源项目-基于Amaze UI的点餐系统
    DSOframer 微软官方API的查阅方法
    DSOframer 的简单介绍和资源整理
    2015-新的阻力,新的努力
  • 原文地址:https://www.cnblogs.com/Alex80/p/7723080.html
Copyright © 2020-2023  润新知