Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用聚集索引更改分区方案_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 使用聚集索引更改分区方案

Sql 使用聚集索引更改分区方案,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个表,它有6亿条记录,并且在PS_TRPdate(TRPdate)列上有分区,我想把它改成另一个分区PS_LPDate(LPDate) 因此,我尝试了以下步骤处理少量数据。 1) 删除主键约束。 2) 使用新分区PS_LPDate(LPDate)添加新的主键聚集索引 6亿条记录是否可行?谁能给我指点一下吗? 它如何处理非分区表 --343我的直觉是,您应该使用新的主键、文件组和文件创建一个并行表 为了验证我的假设,我看了一个将前500万个素数存储到三个文件/文件组中的示例 我使用了编写的T

我有一个表,它有6亿条记录,并且在PS_TRPdate(TRPdate)列上有分区,我想把它改成另一个分区PS_LPDate(LPDate)

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

6亿条记录是否可行?谁能给我指点一下吗? 它如何处理非分区表


--343

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

为了验证我的假设,我看了一个将前500万个素数存储到三个文件/文件组中的示例

我使用了编写的TSQL视图,并修改了我的标准来查看分区信息

如您所见,我们有三个基于主键的分区

-- 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)

接下来,我将主键放在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

出于好奇,您为什么要更改分区?您知道我们的TrUpdate上有用户不使用的分区,他们大多使用LPDate。谢谢John…感谢您的帮助。我曾尝试删除索引并重新创建,正如您所提到的,一个表中有近2000万条记录,这几乎花费了4分钟,但我希望得到6亿条记录的答案,如果我做同样的练习,需要多少时间?这些练习将在生产中进行。最重要的是,我有将近183张表格,其中最大记录为6.29亿张,最小记录为8400万张。我想要6亿条记录分区更改的可行性。对我来说,这完全取决于磁盘大小。如我们所知,尺寸越大,进行更改的时间越长。另外,关于183个表有什么评论。所有的桌子都分区了吗?或者它们只是在主文件组中?在183个表中,有些表已经分区,有些表没有分区。总的来说,数据库大小接近1.5TB。好的,有什么原因不能并行重建6.29亿行表吗?如果需要在同一数据库中使用它,请将其命名为[new_table_name]。使用新文件组、新文件、一个具有更新PK的新表和新分区函数/模式。使用生产切换的同义词。那时候把旧桌子放下。如果可以的话。使用数据压缩。我对4TB的表也有同样的问题,并且能够将其减少到500GB。然而,它以高昂的企业版价格推出!