查询执行的物理读取总数是否 = [物理读取数c] + [预读读取]?
不,这些是单独计算的。
物理读取: 从磁盘运行线程读取的页面数进入可运行状态并等待 IO 完成。
预读如下:
数据库引擎支持称为预读的性能优化机制。预读预期完成查询执行计划所需的数据和索引页,并在查询实际使用这些页之前将它们放入缓冲区缓存。这允许计算和 I/O 重叠,充分利用 CPU 和磁盘。有两种预读:一种用于数据页,一种用于索引页。
为什么有时我们有[物理读取]=0 而[预读]>0?这意味着什么?
如前所述,read ahead pages
不包括在physical read
. 这意味着所有需要的页面都已经在缓存中。这些页面要么已经存在,要么通过预读机制放置在缓存中。
SQL Server 在一次物理读取中读取了多少页?...如果是一对一,那么
这不是一对一的。它会有所不同。请参阅下面的参考部分。
为什么当“select * from aTable”时,[物理读取]和/或[预读]的数量不等于表的页数?尽管在执行查询之前清除了缓存。
如前所述,物理读取和预读可以一次读取多于一页。
预读机制允许数据库引擎从一个文件中读取最多 64 个连续页面 (512KB)。读取作为对缓冲区缓存中适当数量(可能是不连续的)缓冲区的单个分散-聚集读取执行。如果该范围内的任何页面已存在于缓冲区缓存中,则读取完成时将丢弃读取中的相应页面。如果相应的页面已经存在于缓存中,则页面范围也可以从任一端“修剪”。
为什么有时[逻辑读取]大于[物理读取]+[预读]
因为您的页面已经在缓冲区中,所以在这种情况下读取意味着逻辑读取,您不需要(或您需要少于)物理读取 + 预读读取。
甚至大于表的总页数?
从缓存中读取时可以多次读取同一页。考虑对索引进行查找操作。如果您必须执行 10 次查找,您将始终在根页面上执行 10 次逻辑读取,并且可能在每个中间级别上执行 10 次逻辑读取。
参考: