我有一个基本上是日志表的集群PK,显然不应该集群。
当我这样做时:
alter table mytable drop constraint pk_mytable
我的机器上的数据库副本需要一个绝对年龄(5分钟以上),所以在生成数据库上总是不起作用而不会导致超时或超时。
为什么这不是即时操作?它在做什么?
有没有办法在不让我的网站离线的情况下实现这一目标?
更新:该表有10亿行,有5行?其他非聚集索引
由于
答案 0 :(得分:1)
群集索引使用MS SQL Server(我假设您正在使用的)物理设置磁盘上的记录顺序。因此,当重写整个表时,这将导致整个IO堆。
如果你没有指定聚簇索引,我相信SQL会为你创建一个,因为它使用它来交叉引用索引而不必从表中读取记录。
答案 1 :(得分:0)
我不确定你为什么要这样做,但这是最好的方法:
答案 2 :(得分:0)
我怀疑当你试图删除主键时桌面上有某种形式的锁定,一般来说,在每个表上都有一个聚集索引实际上是一种很好的做法。这实际上加快了一些操作,如删除和更新等。除了你的表是一个日志表的事实之外,你想要放弃这个的理由是什么?再说一遍,一般来说,如果我所讨论的表是某种形式的临时表,需要并发/大插入快速,我只会倾向于堆,我会问这个问题,你有性能问题吗?当插入到表中时,另一个想要删除聚簇主键的可行原因是群集密钥错误,即宽,易变且不单调增加,除非您有一个基于固态的I / O子系统不受影响通过随机I / O以与旋转基于磁盘的存储相同的方式。 Nigels在他所说的内容中是正确的,这是SQL Azure的一个例外,这要求**每个**表都有一个聚合索引,其HA架构依赖于此。