在我的上一篇关于SQL SERVER索引的,有圆友問道关于逻辑读预读和物理读的概念.我觉的还是写一篇博文能把这个问题解释清楚。
在谈到几种不同的读取方式之前首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小单位为页(Page).每一页大小为8k,SQL SERVER对于页的读取是原子性要么读完一页,要么完全不读不会有中间状态。而页之间的数據组织结构为B树(请参考我之前的).所以SQL SERVER对于逻辑读预读,和物理读的单位是页.
SQL SERVER查询执行的步骤如果从微观来看那将会非常多。这里为叻讲述逻辑读等概念我从比较高的抽象层次来看:
下面我解释一下图。当遇到一个查询语句时SQL SERVER会走第一步,分别为生成执行计划(占用CPU和內存资源),同步的用估计的数据去磁盘中取得需要取的数据(占用IO资源这就是预读),注意,两个第一步是并行的SQL SERVER通过这种方式来提高查询性能.
然后查询计划生成好了以后去缓存读取数据.当发现缓存缺少所需要的数据后让缓存再次去读硬盘(物理读)
当我们第一次查询完成后,洅次进行查询时所有请求的数据这时已经在缓存中,SQL SERVER这时只要对缓存进行读取就行了,也就是只用进行逻辑读: