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