为什么'物理读数'低于'预读读数'& SQL Server中的“逻辑读取”首次执行查询?

时间:2011-04-19 20:45:17

标签: sql-server sql-server-2005

我重新启动了SQL Server 2005并运行了一个带有统计信息IO的查询。

我得到了这些结果: 表'xxx'。扫描计数1,逻辑读取789,物理读取3,预读读取794,...

预读读取是读取并放置在缓存中的页数。那么物理读数至少应该是相同的数字吗?

另外因为它是查询的第一次运行,逻辑读取不应该是0吗? 或者是SQL Server物理读取页面,将它们放入缓存然后从缓存中读取?当缓存应为空时,为什么有逻辑读取计数?

3 个答案:

答案 0 :(得分:4)

所有读取都是逻辑读取。

除了将页面放入缓存之外,还有一些还会导致物理读取和预读取。

据推测,它提前阅读了一些查询从未实际需要的页面,因此这个数字略大于实际的逻辑读取。

答案 1 :(得分:3)

来自MS的文档说“预读读取”正在将页面读入缓存。这不是很有用......人们会认为“物理读取”也会将生成的页面放入缓存中。

我对MS所说的重新措辞是:

  • 物理读取 - 阻止查询,等待将页面从磁盘读取到缓存中以供立即使用。
  • Read-Ahead Read - 在阻止查询之前正在读取页面,并且所有读取都将其读入缓存。在扫描索引时可以进行预读,在这种情况下,索引中的下一个叶页可以假设需要,并且可以在查询实际表明它需要之前为它们启动读取。这允许磁盘在db引擎检查先前获取的页面的内容时忙。

我无法在任何地方找到他们这样说,但如果这不是他们真正想说的话,那么预读就毫无意义。

答案 2 :(得分:0)

我不知道这里有明确的答案,但更新统计数据也可以飙升其中一些数字。

您的查询是什么样的?什么是SQL Server版本?

不同的JOIN方法[嵌套循环,合并连接,散列连接]可以添加额外的逻辑读取。与其他版本相比,企业版具有良好的预读优化。