var*_*ble 2 sql-server sql-server-2019
运行以下命令后,我正在查看查询的输出:SET STATISTICS IO ON
表1显示扫描计数为5,逻辑读取12197
表2显示扫描计数为0,逻辑读取80
文档说
扫描计数是在任何方向到达叶级别后开始的查找或扫描次数,以检索所有值以构建输出的最终数据集。
我正在寻找一个示例来了解此(扫描计数)对于上述输出的含义。我的困惑是,仅 5 次扫描如何实现 12197 的逻辑读取?
正如引用所说,扫描次数是数据库引擎启动的扫描操作的次数。
\n这些扫描可能是表或索引的完整扫描。它们可能是在初始查找之后按索引顺序向前或向后扫描,也可以选择具有终点。
\nSQL Server 中唯一不被视为扫描类型的是对单个值到唯一索引的相等查找。这包括 RID 和键查找,根据定义,它们是对单行的相等查找。
\n可能很难将 RID 查找视为查找,但它实际上是使用文件、页和行号直接定位行。RID 查找中不涉及扫描。
\n当引擎检查其他匹配行时,其他所有内容都有一个扫描组件。
\n显然,一次扫描可能会读取不止一页。
\n并行扫描(或使用范围组件进行查找)通常会显示每个线程一次扫描,以及将范围分配给子工作线程的父任务的一次扫描。例如,DOP 8 的完整扫描将显示 9 次扫描。
\n嵌套循环内侧的运算符可能会报告多次扫描,因为它们在每次新迭代中关闭并重新打开。
\n请参阅 Amit Banerjee 在 Microsoft SQL Server Tips & Tricks 博客上的以下内容:
\n\n另外,我的文章:
\n\n将扫描计数视为一个操作。您需要执行五次操作才能检索 12,197 个页面。没有看到执行计划,我只是猜测,但让我们假设一个嵌套循环连接。连接顶部有 5 行,因此连接底部的数据访问已完成五次以检索 12,197 个页面。例如,如果您在连接底部看到聚集索引扫描,则每个操作、每个扫描都可能会命中整个表。因此,五个操作导致大量页面被移动。
我希望这有帮助。