Sql server 为什么是';物理读数';小于';预读读读'&';逻辑读取';在SQL Server中首次执行查询?
我重新启动了SQLServer2005,并在统计IO上运行了一个查询 我得到了这些结果: 表“xxx”。扫描计数1,逻辑读取789,物理读取3,预读读取794 read ahead reads是已读取并放置在缓存中的页数。那么物理读数不应该至少是相同的数字吗 另外,因为这是查询的第一次运行,所以逻辑读取不应该是0吗?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正在物理读取页面,将其放入缓存,然后从缓存中读取?当缓存应该为空时,为什么会有逻辑读取计数?我不知道这里的确切答案,但更新统计数据也会使其中一些数字增加 您
或者SQL Server正在物理读取页面,将其放入缓存,然后从缓存中读取?当缓存应该为空时,为什么会有逻辑读取计数?我不知道这里的确切答案,但更新统计数据也会使其中一些数字增加 您的查询是什么样子的?什么是SQL Server版本
不同的连接方法[嵌套循环、合并连接、哈希连接]可以添加额外的逻辑读取。与其他版本相比,Enterprise edition具有良好的预读优化。所有读取都是逻辑读取 除了将页面带到缓存中之外,有些还引发物理读取和预读读取 据推测,它会提前读取一些您的查询从未实际需要的页面,因此这个数字略大于实际的逻辑读取。来自MS的文档说,“提前读取”正在将页面读取到缓存中。那不是很有帮助。。。我们可以假设“物理读取”也会将结果页放入缓存中 我对MS所说内容的重新措辞是:
- 物理读取-查询被阻止,等待页面从磁盘读取到缓存以立即使用
- 预读-页面在阻止查询之前被读取,并像所有读取一样被读入缓存。当您扫描索引时,可以读取标题,在这种情况下,可以假定索引中的下一个叶页是需要的,并且可以在查询实际表示需要它们之前为它们启动读取。这允许磁盘在db引擎检查以前获取的页面内容时处于忙碌状态
我在任何地方都找不到他们这么说,但如果这不是他们真正想说的话,提前阅读将毫无意义。问题不在于高逻辑阅读。这是关于为什么与第一次运行查询的其他读取相比,物理读取非常低。物理读取以不同的方式显示,在本例中,它们来自预读读取。您的意思是3次物理读取足以获得结果,并且它读取791(794-3)个额外的物理页面。。出于什么原因?不。它有两种不同的机制将页面放入缓存。当它意识到它可能正在读取一段连续的页面时,它将使用在您的查询实际请求之前引入其他页面。因此,在需要它们的时候,它们已经在缓存中,SQL Server不需要执行特定的物理读取来获取该页面。虽然还不完全清楚,但我必须进行大量测试才能完全理解。谢谢对任何想进一步了解的人来说:(缓冲区管理)预读是由辅助线程执行的。因此,例如,对于索引范围扫描,预读机制将父节点扫描到叶级节点,以便引入当前未在缓存中的任何叶级页面,以完成扫描。