我的表有6亿条记录,并且还有PS_TRPdate(TRPDate)列上的分区,我想将其更改为另一个分区PS_LPDate(LPDate)。
所以我尝试使用以下步骤处理少量数据。 1)删除主键约束。 2)使用新的分区PS_LPDate(LPDate)添加新的主键聚簇索引。
6亿条记录是否可行?任何人都可以指导我吗? 以及它如何与非分区表一起使用?
- 343
答案 0 :(得分:1)
我的直觉是你应该使用新的主键,文件组和文件创建一个并行表。
为了测试我的假设,我查看了一个old blog post,其中我将前五百万个素数存储到三个文件/文件组中。
我使用了Kalen Delaney编写的TSQL视图,并修改了我的标准来查看分区信息。
如您所见,我们有三个基于主键的分区。
接下来,我将主键放在my_value列上,创建一个名为chg_value的新列,将其更新为素数,然后尝试创建一个新的主键。
-- drop primary key (pk)
alter table tbl_primes drop constraint [PK_TBL_PRIMES]
-- add new field for new pk
alter table tbl_primes add chg_value bigint not null default (0)
-- update new field
update tbl_primes set chg_value = my_value
-- try to add a new primary key
alter table tbl_primes add constraint [PK_TBL_PRIMES] primary key (chg_value)
首先,我很惊讶在丢弃PK后分区仍然保持在一起。但是,该视图显示索引不再存在。
其次,我在约束创建期间最终收到以下错误。
虽然您可以将分区合并/切换到一个不属于该方案的文件组,但是删除/创建主键,分区功能&分区方案,然后使用适当的merge / switch语句再次移动数据,我不会。
这会产生大量工作(TSQL)并导致磁盘上出现大量I / O.
我建议您使用新的主键构建并行分区表(如果有空间)。将旧表中的数据重新加载到新表。
如果您没有使用数据压缩并拥有企业版的SQL Server,为什么不通过打开它来保存字节。
祝你好运!约翰
<强> www.craftydba.com 强>