Mic*_*een 5 sql-server data-pages
在这篇文章中,作者多次运行查询。我注意到逻辑读取在执行过程中略有不同。总共读了几千页,大约有两页的差异。从上下文中我可以清楚地看出,两次之间不会有写入活动。如果计划发生变化,我预计会有比百分之几更大的变化。
问:哪些因素会导致 SQL Server 在没有数据写入的情况下对同一查询报告不同的逻辑读取计数?
哪些因素会导致 SQL Server 在没有数据写入的情况下为同一查询报告不同的逻辑读取计数?
对于堆表,据我所知,没有任何机制会导致这种情况。
我注意到作者报告的逻辑读取仅在使用压缩时有所不同。这表明每次执行时都包含表重建。重建语句未指定MAXDOP = 1
,因此将生成并行计划。在运行时重建中行在线程之间分布的方式是不确定的(它取决于时间),因此堆的最终结构会有所不同。这是我能够重现已发布结果的唯一方法。
对于聚集表(或一般索引结构的查找/扫描),逻辑读取可能会因预读活动而变化。预读从 B 树的上层读取页面,以识别要在扫描之前读取的页面,从而导致不同数量的“额外”逻辑读取,具体取决于存储系统的时序和特性。使用全局跟踪标志 652 禁用预读可用于演示这一点。
我提到预读方面只是为了完整性,因为所讨论的表是一个堆。堆扫描确实使用预读,但这是由 IAM 页面驱动的。IAM 页不构成主表结构的一部分(与 B 树的上层不同),因此这些额外的读取不会由STATISTICS IO
.
归档时间: |
|
查看次数: |
345 次 |
最近记录: |