SQL Server 预读和物理读 的区别

今天在网上看到有人在讨论预读和物理读的区别,个人觉得物理读和预读都是IO操作,都是需要从磁盘中读取数据到内存,只是读取的时间有所不同,之后查了一下MSDN确认了这种想法。

 

预读是在生成执行的同时去做的,通过这种方式可以提高IO的性能。而物理读是当执行计划生成好后去缓存读取数据发现缺少数据之后才到磁盘读取。当所有数据都从缓存中可以读取就变成读。

 

下面举个例子:

 

LINEITEM 表中大概存储了600W数据,我们使用SET STATISTICS IO ON

SET STATISTICS IO ON

SELECT COUNT(*) FROM LINEITEM

Table 'LINEITEM'. Scan count 3, logical reads 22328, physicalreads 3, read-ahead reads20331, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


重复执行这条语句看到预读已经变为0,因为所有的数据已经在缓存中了:


SELECT COUNT(*) FROM LINEITEM

Table 'LINEITEM'. Scan count 3, logical reads 22328, physicalreads 0, read-ahead reads 0,lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

对于预读的解释:

数据库引擎支持称为“预读”的性能优化机制。预读首先预测执行查询执行计划所需的数据和索引页,然后在查询实际使用这些页之前将它们读入缓冲区高速缓存。这样可以让计算和 I/O 重叠进行,从而充分利用 CPU 和磁盘。

预读机制允许数据库引擎从一个文件中读取最多 64 个连续页 (512KB)。该读取作为缓冲区高速缓存中相应数量(可能是非相邻的)缓冲区的一次散播-聚集读取来执行。如果此范围内的任何页在缓冲区高速缓存中已存在,当读取完成时,所读取的相应页将被放弃。如果相应页在缓存中已存在,也可以从任何一端“裁剪”页的范围。


关于预读可以参考MSDN: http://msdn.microsoft.com/zh-cn/library/ms191475.aspx




你可能感兴趣的:(SQL,Server,General)