Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么是';物理读数';小于';预读读读'&';逻辑读取';在SQL Server中首次执行查询?_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 为什么是';物理读数';小于';预读读读'&';逻辑读取';在SQL Server中首次执行查询?

Sql server 为什么是';物理读数';小于';预读读读'&';逻辑读取';在SQL Server中首次执行查询?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我重新启动了SQLServer2005,并在统计IO上运行了一个查询 我得到了这些结果: 表“xxx”。扫描计数1,逻辑读取789,物理读取3,预读读取794 read ahead reads是已读取并放置在缓存中的页数。那么物理读数不应该至少是相同的数字吗 另外,因为这是查询的第一次运行,所以逻辑读取不应该是0吗? 或者SQL Server正在物理读取页面,将其放入缓存,然后从缓存中读取?当缓存应该为空时,为什么会有逻辑读取计数?我不知道这里的确切答案,但更新统计数据也会使其中一些数字增加 您

我重新启动了SQLServer2005,并在统计IO上运行了一个查询

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

read ahead reads是已读取并放置在缓存中的页数。那么物理读数不应该至少是相同的数字吗

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

我不知道这里的确切答案,但更新统计数据也会使其中一些数字增加

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


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

所有读取都是逻辑读取

除了将页面带到缓存中之外,有些还引发物理读取和预读读取

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

来自MS的文档说,“提前读取”正在将页面读取到缓存中。那不是很有帮助。。。我们可以假设“物理读取”也会将结果页放入缓存中

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

  • 物理读取-查询被阻止,等待页面从磁盘读取到缓存以立即使用
  • 预读-页面在阻止查询之前被读取,并像所有读取一样被读入缓存。当您扫描索引时,可以读取标题,在这种情况下,可以假定索引中的下一个叶页是需要的,并且可以在查询实际表示需要它们之前为它们启动读取。这允许磁盘在db引擎检查以前获取的页面内容时处于忙碌状态

我在任何地方都找不到他们这么说,但如果这不是他们真正想说的话,提前阅读将毫无意义。

问题不在于高逻辑阅读。这是关于为什么与第一次运行查询的其他读取相比,物理读取非常低。物理读取以不同的方式显示,在本例中,它们来自预读读取。您的意思是3次物理读取足以获得结果,并且它读取791(794-3)个额外的物理页面。。出于什么原因?不。它有两种不同的机制将页面放入缓存。当它意识到它可能正在读取一段连续的页面时,它将使用在您的查询实际请求之前引入其他页面。因此,在需要它们的时候,它们已经在缓存中,SQL Server不需要执行特定的物理读取来获取该页面。虽然还不完全清楚,但我必须进行大量测试才能完全理解。谢谢对任何想进一步了解的人来说:(缓冲区管理)预读是由辅助线程执行的。因此,例如,对于索引范围扫描,预读机制将父节点扫描到叶级节点,以便引入当前未在缓存中的任何叶级页面,以完成扫描。