我在SQL Server数据库中有一个表,在主键上有聚簇索引。该表有100万行。如果我从表中删除了1万行,执行删除操作期间索引是否会被重组?
删除操作是存储过程的一部分。一次,一个以上的客户端可以执行该存储过程,但是每个单独的运行都将删除其自己的一组行(由主键唯一标识)。当多个客户端执行该过程时,我将无法使用(U型)键锁。阻止程序锁属于同一表中的一行,并且不属于任何同时运行的事务。不应有任何阻塞,因为每次运行都试图删除自己的行集。由于已关闭锁升级,因此不会发生。
我怀疑,删除操作一定会导致索引重新平衡,因此在重组过程中,它可能会对表的任何行进行键锁定。
我对此表示感谢。
好问题,好猜测。是的,删除记录时,将重新建立索引。在重建过程中,表被锁定,其他用户将无法访问该表。stackoverflow.com/questions/6309614/…–
—
KumarHarsh
否,删除聚集索引上的行不会导致索引重建。您还可以发布用于删除数据的查询吗?当查询试图查找将被删除的数据时,U锁就会出现,最后将其排他地锁定以将其删除。
—
Shanky
删除发生时,会创建一个“空洞”,或者您可以说是空格,因为数据已从聚集索引中删除。这可能会导致低页面密度,并可以视为碎片。当在CI上发生插入操作时,它将在右侧填充记录,因此可能永远不会填充该空间。但是SQL Server不会自动删除该空间。您必须重建索引或重新组织以填充此空间。没有这样的重新平衡
—
Shanky
@jayesh我看不到树中节点的顺序与重新平衡有何关系。B树可能是不平衡的(由于插入或删除)。在这些情况下,节点顺序不变。它只是一棵不平衡的树。
—
ypercubeᵀᴹ
@jayesh我认为您可能会从阅读一些MSSQL文档中受益,因为我认为您使用的术语使您和我们中的一些人感到困惑。
—
LowlyDBA '18