0

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

当我做:

alter table mytable drop constraint pk_mytable

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

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

有什么方法可以在不使我的网站脱机的情况下实现这一目标?

更新:该表有几百万行,有几个 5?其他非聚集索引

谢谢

4

3 回答 3

1

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

如果您不指定聚集索引,我相信 SQL 无论如何都会为您创建一个,因为它使用它来交叉引用索引,而不必从表中读取记录。

于 2013-04-03T17:44:30.440 回答
0

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

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

我怀疑当您尝试删除主键时表上存在某种形式的锁定,一般来说,在每个表上都有一个聚集索引实际上是一个好习惯。这实际上加快了一些操作,例如删除和更新等。除了您的表是日志表这一事实之外,您想要删除它的理由是什么?同样,一般来说,如果我所讨论的表是某种形式的临时表,它需要并发/大型插入快速,我只会倾向于堆,因此我会问这个问题,你有没有性能问题是插入表时可以量化,想要删除集群主键的另一个可行原因是集群键错误,即宽、易变且不单调增加,除非你有一个基于固态的 I/O 子系统,它不受随机 I/O 的影响,就像基于旋转磁盘的存储一样。Nigels 的说法是正确的,SQL Azure 是一个例外,这要求 ** 每个 ** 表都有一个聚集索引,他们的 HA 架构依赖于此。

于 2013-04-03T19:06:02.210 回答