如何在生产数据库上创建聚簇PK非聚集?

时间:2013-04-03 17:13:16

标签: sql-server tsql

我有一个基本上是日志表的集群PK,显然不应该集群。

当我这样做时:

alter table mytable drop constraint pk_mytable

我的机器上的数据库副本需要一个绝对年龄(5分钟以上),所以在生成数据库上总是不起作用而不会导致超时或超时。

为什么这不是即时操作?它在做什么?

有没有办法在不让我的网站离线的情况下实现这一目标?

更新:该表有10亿行,有5行?其他非聚集索引

由于

3 个答案:

答案 0 :(得分:1)

群集索引使用MS SQL Server(我假设您正在使用的)物理设置磁盘上的记录顺序。因此,当重写整个表时,这将导致整个IO堆。

如果你没有指定聚簇索引,我相信SQL会为你创建一个,因为它使用它来交叉引用索引而不必从表中读取记录。

答案 1 :(得分:0)

我不确定你为什么要这样做,但这是最好的方法:

  1. 创建一个具有相同结构的新表(除了没有任何索引)。
  2. 将当前表中的所有数据导入新表
  3. 删除当前表
  4. 将新表重命名为旧表名
  5. 创建任何非聚集索引(如果您的原始表具有非聚集索引,并且如果您需要这些索引)

答案 2 :(得分:0)

我怀疑当你试图删除主键时桌面上有某种形式的锁定,一般来说,在每个表上都有一个聚集索引实际上是一种很好的做法。这实际上加快了一些操作,如删除和更新等。除了你的表是一个日志表的事实之外,你想要放弃这个的理由是什么?再说一遍,一般来说,如果我所讨论的表是某种形式的临时表,需要并发/大插入快速,我只会倾向于堆,我会问这个问题,你有性能问题吗?当插入到表中时,另一个想要删除聚簇主键的可行原因是群集密钥错误,即宽,易变且不单调增加,除非您有一个基于固态的I / O子系统不受影响通过随机I / O以与旋转基于磁盘的存储相同的方式。 Nigels在他所说的内容中是正确的,这是SQL Azure的一个例外,这要求**每个**表都有一个聚合索引,其HA架构依赖于此。