我在本质上是一个日志表上有一个集群 PK,显然不应该集群。
当我做:
alter table mytable drop constraint pk_mytable
我的机器上的数据库副本需要一个绝对的时间(5 分钟以上),所以在生产数据库上总是不会工作而不会导致超时或超时。
为什么不是即时操作?它在做什么?
有什么方法可以在不使我的网站脱机的情况下实现这一目标?
更新:该表有几百万行,有几个 5?其他非聚集索引
谢谢
我在本质上是一个日志表上有一个集群 PK,显然不应该集群。
当我做:
alter table mytable drop constraint pk_mytable
我的机器上的数据库副本需要一个绝对的时间(5 分钟以上),所以在生产数据库上总是不会工作而不会导致超时或超时。
为什么不是即时操作?它在做什么?
有什么方法可以在不使我的网站脱机的情况下实现这一目标?
更新:该表有几百万行,有几个 5?其他非聚集索引
谢谢
聚集索引使用 MS SQL Server 物理设置磁盘上的记录顺序(我假设您正在使用它)。因此,这将导致整个 IO 堆,因为它会重写整个表。
如果您不指定聚集索引,我相信 SQL 无论如何都会为您创建一个,因为它使用它来交叉引用索引,而不必从表中读取记录。
我不确定您为什么要这样做,但这是最好的方法:
我怀疑当您尝试删除主键时表上存在某种形式的锁定,一般来说,在每个表上都有一个聚集索引实际上是一个好习惯。这实际上加快了一些操作,例如删除和更新等。除了您的表是日志表这一事实之外,您想要删除它的理由是什么?同样,一般来说,如果我所讨论的表是某种形式的临时表,它需要并发/大型插入快速,我只会倾向于堆,因此我会问这个问题,你有没有性能问题是插入表时可以量化,想要删除集群主键的另一个可行原因是集群键错误,即宽、易变且不单调增加,除非你有一个基于固态的 I/O 子系统,它不受随机 I/O 的影响,就像基于旋转磁盘的存储一样。Nigels 的说法是正确的,SQL Azure 是一个例外,这要求 ** 每个 ** 表都有一个聚集索引,他们的 HA 架构依赖于此。