当前位置: 代码迷 >> Sql Server >> Sql2005中能否给一个已存在的表添加分区方案,该怎么解决
  详细解决方案

Sql2005中能否给一个已存在的表添加分区方案,该怎么解决

热度:46   发布时间:2016-04-27 14:44:31.0
Sql2005中能否给一个已存在的表添加分区方案
数据表已经存在并且有大量数据
请问这时候设计一个数据分区方案的话,如何体现在这个表中呢,打开表的属性中显示分区方案和分组文件中都是灰的不能改
问题1:能否改,怎么改
问题2:对于已经存在的数据是否会按调整的分区方案和分组文件重新分布已有的存储数据
如有不清楚的地方请提出,谢谢

------解决方案--------------------
可以改!
------解决方案--------------------
SQL code
-- 进行演示操作前, 先备份, 以便可以在演示完成后, 恢复到原始状态USE master-- 备份BACKUP DATABASE AdventureWorks    TO DISK = 'AdventureWorks.bak'    WITH FORMAT---- 恢复--RESTORE DATABASE AdventureWorks--    FROM DISK = 'AdventureWorks.bak'--    WITH REPLACEGO--=========================================-- 转换为分区表--=========================================USE AdventureWorksGO-- 1. 创建分区函数--    a. 适用于存储历史存档记录的分区表的分区函数DECLARE @dt datetimeSET @dt = '20020101'CREATE PARTITION FUNCTION PF_HistoryArchive(datetime)AS RANGE RIGHTFOR VALUES(    @dt,     DATEADD(Year, 1, @dt))--    b. 适用于存储历史记录的分区表的分区函数--DECLARE @dt datetimeSET @dt = '20030901'CREATE PARTITION FUNCTION PF_History(datetime)AS RANGE RIGHTFOR VALUES(    @dt,     DATEADD(Month, 1, @dt), DATEADD(Month, 2, @dt), DATEADD(Month, 3, @dt),    DATEADD(Month, 4, @dt), DATEADD(Month, 5, @dt), DATEADD(Month, 6, @dt),    DATEADD(Month, 7, @dt), DATEADD(Month, 8, @dt), DATEADD(Month, 9, @dt),    DATEADD(Month, 10, @dt), DATEADD(Month, 11, @dt), DATEADD(Month, 12, @dt))GO-- 2. 创建分区架构--    a. 适用于存储历史存档记录的分区表的分区架构CREATE PARTITION SCHEME PS_HistoryArchiveAS PARTITION PF_HistoryArchiveTO([PRIMARY], [PRIMARY], [PRIMARY])--    b. 适用于存储历史记录的分区表的分区架构CREATE PARTITION SCHEME PS_HistoryAS PARTITION PF_HistoryTO([PRIMARY], [PRIMARY],     [PRIMARY], [PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY])GO-- 3. 删除索引--    a. 删除存储历史存档记录的表中的索引DROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ProductIDDROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID--    b. 删除存储历史记录的表中的索引DROP INDEX Production.TransactionHistory.IX_TransactionHistory_ProductIDDROP INDEX Production.TransactionHistory.IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineIDGO-- 4. 转换为分区表--    a. 将存储历史存档记录的表转换为分区表ALTER TABLE Production.TransactionHistoryArchive    DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID    WITH(        MOVE TO PS_HistoryArchive(TransactionDate))--    b.将存储历史记录的表转换为分区表ALTER TABLE Production.TransactionHistory    DROP CONSTRAINT PK_TransactionHistory_TransactionID    WITH(        MOVE TO PS_History(TransactionDate))GO-- 5. 恢复主键--    a. 恢复存储历史存档记录的分区表的主键ALTER TABLE Production.TransactionHistoryArchive    ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID        PRIMARY KEY CLUSTERED(            TransactionID,            TransactionDate)--    b. 恢复存储历史记录的分区表的主键ALTER TABLE Production.TransactionHistory    ADD CONSTRAINT PK_TransactionHistory_TransactionID        PRIMARY KEY CLUSTERED(            TransactionID,            TransactionDate)GO-- 6. 恢复索引--    a. 恢复存储历史存档记录的分区表的索引CREATE INDEX IX_TransactionHistoryArchive_ProductID     ON Production.TransactionHistoryArchive(        ProductID)CREATE INDEX IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID    ON Production.TransactionHistoryArchive(        ReferenceOrderID,        ReferenceOrderLineID)--    b. 恢复存储历史记录的分区表的索引CREATE INDEX IX_TransactionHistory_ProductID     ON Production.TransactionHistory(        ProductID)CREATE INDEX IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID    ON Production.TransactionHistory(        ReferenceOrderID,        ReferenceOrderLineID)GO-- 7. 查看分区表的相关信息SELECT    SchemaName = S.name,    TableName = TB.name,    PartitionScheme = PS.name,    PartitionFunction = PF.name,    PartitionFunctionRangeType = CASE            WHEN boundary_value_on_right = 0 THEN 'LEFT'            ELSE 'RIGHT' END,    PartitionFunctionFanout = PF.fanout,    SchemaID = S.schema_id,    ObjectID = TB.object_id,    PartitionSchemeID = PS.data_space_id,    PartitionFunctionID = PS.function_idFROM sys.schemas S    INNER JOIN sys.tables TB        ON S.schema_id = TB.schema_id    INNER JOIN sys.indexes IDX        on TB.object_id = IDX.object_id            AND IDX.index_id < 2    INNER JOIN sys.partition_schemes PS        ON PS.data_space_id = IDX.data_space_id    INNER JOIN sys.partition_functions PF        ON PS.function_id = PF.function_idGO--=========================================-- 移动分区表数据--=========================================-- 1. 为存储历史存档记录的分区表增加分区, 并接受从历史记录分区表移动过来的数据--    a. 修改分区架构, 增加用以接受新分区的文件组ALTER PARTITION SCHEME PS_HistoryArchiveNEXT USED [PRIMARY]--    b. 修改分区函数, 增加分区用以接受从历史记录分区表移动过来的数据DECLARE @dt datetimeSET @dt = '20030901'ALTER PARTITION FUNCTION PF_HistoryArchive()SPLIT RANGE(@dt)--    c. 将历史记录表中的过期数据移动到历史存档记录表中ALTER TABLE Production.TransactionHistory    SWITCH PARTITION 2        TO Production.TransactionHistoryArchive PARTITION $PARTITION.PF_HistoryArchive(@dt)--    d. 将接受到的数据与原来的分区合并ALTER PARTITION FUNCTION PF_HistoryArchive()MERGE RANGE(@dt)GO-- 2. 将存储历史记录的分区表中不包含数据的分区删除, 并增加新的分区以接受新数据--    a. 合并不包含数据的分区DECLARE @dt datetimeSET @dt = '20030901'ALTER PARTITION FUNCTION PF_History()MERGE RANGE(@dt)--    b.  修改分区架构, 增加用以接受新分区的文件组ALTER PARTITION SCHEME PS_HistoryNEXT USED [PRIMARY]--    c. 修改分区函数, 增加分区用以接受新数据SET @dt = '20041001'ALTER PARTITION FUNCTION PF_History()SPLIT RANGE(@dt)GO--=========================================-- 清除历史存档记录中的过期数据--=========================================-- 1. 创建用于保存过期的历史存档数据的表CREATE TABLE Production.TransactionHistoryArchive_2001_temp(    TransactionID int NOT NULL,    ProductID int NOT NULL,    ReferenceOrderID int NOT NULL,    ReferenceOrderLineID int NOT NULL        DEFAULT ((0)),    TransactionDate datetime NOT NULL        DEFAULT (GETDATE()),    TransactionType nchar(1) NOT NULL,    Quantity int NOT NULL,    ActualCost money NOT NULL,    ModifiedDate datetime NOT NULL        DEFAULT (GETDATE()),    CONSTRAINT PK_TransactionHistoryArchive_2001_temp_TransactionID        PRIMARY KEY CLUSTERED(            TransactionID,            TransactionDate))-- 2. 将数据从历史存档记录分区表移动到第1步创建的表中ALTER TABLE Production.TransactionHistoryArchive    SWITCH PARTITION 1        TO Production.TransactionHistoryArchive_2001_temp-- 3. 删除不再包含数据的分区DECLARE @dt datetimeSET @dt = '20020101'ALTER PARTITION FUNCTION PF_HistoryArchive()MERGE RANGE(@dt)-- 4. 修改分区架构, 增加用以接受新分区的文件组ALTER PARTITION SCHEME PS_HistoryArchiveNEXT USED [PRIMARY]-- 5. 修改分区函数, 增加分区用以接受新数据SET @dt = '20040101'ALTER PARTITION FUNCTION PF_HistoryArchive()SPLIT RANGE(@dt)
  相关解决方案