更改SQL Server分区日期边界&最小化数据移动

时间:2014-03-12 17:54:10

标签: sql-server data-partitioning

我有一张表(比方说,AUDIT),数据可以追溯到10年前。很少查询超过1年的数据,完整备份开始耗时太长。所以,我决定使用表分区和部分备份,所以如果(何时!)我需要恢复数据库,我可以先恢复经常查询的数据,然后再恢复旧的数据。

我在其日期时间列(AUDIT_DT)上对AUDIT表进行了分区,从旧数据中分割出最近12个月。 PRIMARY分区保留最近12个月,而OLD_AUDIT_ARCHIVE(只读)分区包含的所有数据都早于此。

我已经走到了这一步。

因此,从现在开始的一个月,我想以类似的方式重新分配数据,同时尽量减少数据移动。我想我需要创建一个临时表,并将一个月的数据切换到它,但是如何将登台表数据切换到OLD_AUDIT_ARCHIVE分区?我的目标是将PRIMARY和OLD_AUDIT_ARCHIVE之间的边界日期向前移动一个月(例如,从201年2月1日 3 到201年3月1日),同时尽量减少数据移动

1 个答案:

答案 0 :(得分:1)

我这样做的方式是:

  1. 设置反映变更的新参数功能和方案
  2. 设置" new"表使用新函数/ scheme
  3. Partition Switch旧表的第一个分区到新表的第一个分区
  4. 从旧的
  5. 中将一个月插入新表格中
  6. 删除旧版
  7. 中的一个月
  8. 分区将第二个分区从旧表切换到新表
  9. 检查数据是否正常移动
  10. 重命名表格
  11. 删除或存档旧表
  12. 最大的问题是你是否可以按照上面的链接中的描述划分交换机;为了让它发挥作用,有许多事情必须是真实的。即便如此,我还是要对它进行一次测试。最糟糕的问题是我得到了一个范围子集错误,因为我错误地定义了新分区。

    编辑:事实上,我忘记了一些步骤。当我这样做时,我在旧表WITH (DROP_EXISTING = ON)上重新创建聚簇索引,在步骤5之后和步骤6之前重新创建新的分区方案。

    代码示例:

    create partition function dateRange1 (date)
        as range left for values ('2014-02-01')
    
    create partition function dateRange2 (date)
        as range left for values ('2014-03-01')
    
    create partition scheme testScheme1 as partition daterange1 
        ALL TO ([PRIMARY])
    
    create partition scheme testScheme2 as partition daterange2 
        ALL TO ([PRIMARY])
    
    create table dbo.dates (dt date);
    create clustered index CX_date ON dbo.dates (dt) ON testScheme1 (dt)
    insert into dates
    select dateadd(day, n, '2013-12-31')
    from NUMS
    where n  < 366
    
    create table dbo.dates_new (dt date);
    create clustered index CX_date2 ON dbo.dates_new (dt) ON testScheme2 (dt)
    
    alter table dbo.dates switch partition 1 to dbo.dates_new partition 1
    
    insert into dates_new
    select dt from dates where dt <= '2014-03-01'
    
    delete from dates where dt <= '2014-03-01'
    
    create clustered index CX_date ON dbo.dates (dt) WITH (DROP_EXISTING = ON) ON testScheme2 (dt)
    alter table dbo.dates switch partition 2 to dbo.dates_new partition 2
    
    select * from dbo.dates
    select * from dates_new
    
    exec sp_rename 'dbo.dates', 'dates_old';
    exec sp_rename 'dbo.dates_new', 'dates';
    
    select * from dbo.dates
    select * from dates_old
    
    drop table dates_old