我有一个包含 75 亿行和 5 个索引的大表。当我删除大约 1000 万行时,我注意到非聚集索引似乎增加了它们存储的页数。
我写了一个查询dm_db_partition_stats
来报告页面中的差异(之后 - 之前):
索引1是聚集索引,索引2是主键。其他的是非聚集的和非唯一的。
为什么那些非聚集索引上的页面会增加?
我预计这些数字在最坏的情况下会保持不变。
我确实看到性能计数器报告在删除期间页面拆分增加。
删除时,幽灵记录是否必须移动到另一个页面?这与“唯一性”有关吗?
我们正在推出 RCSI,但现在,RCSI 已关闭。
它是可用性组中的主节点。我知道快照以某种方式在辅助节点上使用。如果这是相关的,我会感到惊讶。我计划深入研究这个(查看 dbcc 页面输出)以了解更多信息。希望有人看到类似的东西。
一种让我很开心的可能场景:
由于此服务器是 AG 中的主要服务器,因此它会像次要服务器一样受到影响。版本信息添加到主节点上 - 主节点和辅助节点上的数据页完全相同。辅助节点在 AG 更新行时利用版本存储进行读取,但辅助节点不会将自己的时间戳版本写入页面。他们只是继承了主要工作的版本。
为了演示增长,我采用了 Stack Overflow 数据库导出(未启用 RCSI)并在 Posts 表上创建了一堆索引。我用 sp_BlitzIndex @Mode = 2 检查了索引大小(复制/粘贴到电子表格中,并进行了一些清理以最大化信息密度):
然后我删除了大约一半的行:
有趣的是,当删除发生时,数据文件也在增长以适应时间戳!SSMS 磁盘使用报告显示了增长事件 - 这里只是顶部的说明:
(一定喜欢删除使数据库增长的演示。)删除运行时,我再次运行 sp_BlitzIndex。请注意,聚集索引的行数较少,但其大小已经增长了大约 1.5GB。AcceptedAnswerId 上的非聚集索引已经显着增长——它们是一个小值的索引,大部分为空,因此它们的索引大小几乎翻了一番!
我不必等待删除完成来证明这一点,所以我将在那里停止演示。要点是:当您对启用 RCSI、SI 或 AG 之前实现的表进行大删除时,索引(包括集群)实际上可以增长以适应版本存储时间戳的添加。