1

我有一个包含 6 亿条记录的表,并且还有 PS_TRPdate(TRPDate) 列上的分区,我想将其更改为另一个分区 PS_LPDate(LPDate)。

因此,我尝试使用以下步骤处理少量数据。1)删除主键约束。2) 使用新分区 PS_LPDate(LPDate) 添加新的主键聚集索引。

6亿条记录可行吗?任何人都可以指导我吗?以及它如何与非分区表一起使用?

--343

4

1 回答 1

2

我的直觉是您应该使用新的主键、文件组和文件创建一个并行表。

为了验证我的假设,我查看了一篇旧博客文章,其中我将前 500 万个素数存储到三个文件/文件组中。

我使用了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 后分区仍然保持在一起。但是,视图显示索引不再存在。

在此处输入图像描述

其次,我最终在约束创建期间收到以下错误。

在此处输入图像描述

虽然您可以将分区合并/切换到一个不属于该方案的文件组,但删除/创建主键、分区函数和分区方案,然后使用适当的合并/切换语句再次移动数据,我会不是。

这将产生大量工作 (TSQL) 并导致磁盘上的大量 I/O。

如果你有空间,我建议你用新的主键构建一个并行分区表。将旧表中的数据重新加载到新表中。

如果您没有使用数据压缩并且拥有企业版 SQL Server,为什么不打开它来保存字节。

祝你好运!

约翰

www.craftydba.com

于 2013-09-03T19:56:57.910 回答