一种可能使我非常开心的情况:
- 这些行最初是在数据库未启用读取提交的快照(RCSI),快照隔离(SI)或可用性组(AG)时写入的
- 启用了RCSI或SI,或已将数据库添加到可用性组中
- 删除期间,已删除行中添加了14字节的时间戳以支持RCSI / SI / AG读取
由于此服务器是AG中的主要服务器,因此它与次要服务器一样受到影响。版本信息添加在主要数据库上-数据页面在主要数据库和次要数据库上完全相同。当AG正在更新行时,辅助服务器利用版本存储进行读取,但是辅助服务器不会将自己的时间戳版本写入页面。他们只是从主要工作继承了版本。
为了说明增长,我进行了Stack Overflow数据库导出(未启用RCSI)并在Posts表上创建了一堆索引。我使用sp_BlitzIndex @Mode = 2检查了索引大小(将副本复制/粘贴到电子表格中,并进行了一些清理以最大化信息密度):
然后,我删除了大约一半的行:
BEGIN TRAN;
DELETE dbo.Posts WHERE Id % 2 = 0;
GO
有趣的是,在进行删除的同时,数据文件也在增长以适应时间戳!“ SSMS磁盘使用情况报告”显示了增长事件-这只是说明的顶部:
(必须喜欢一个演示,其中的删除操作使数据库得以扩展。)在运行删除操作时,我再次运行了sp_BlitzIndex。请注意,聚集索引的行较少,但是其大小已经增加了约1.5GB。AcceptedAnswerId上的非聚集索引已急剧增长-它们是基于一个很小的值(通常为null)的索引,因此它们的索引大小几乎增加了一倍!
我不必等待删除操作完成就可以证明这一点,因此我将在那里停止演示。重点是:在对启用RCSI,SI或AG之前实现的表进行大的删除时,索引(包括集群的)实际上可以增加以适应版本存储时间戳的增加。