在談到幾種不一樣的讀取方式以前,首先要理解SQL SERVER數據存儲的方式.SQL SERVER存儲的最小單位爲頁(Page).每一頁大小爲8k,SQL SERVER對於頁的讀取是原子性,要麼讀完一頁,要麼徹底不讀,不會有中間狀態。而頁之間的數據組織結構爲B樹(請參考我以前的博文).因此SQL SERVER對於邏輯讀,預讀,和物理讀的單位是頁.html
SQL SERVER一頁的總大小爲:8K緩存
可是這一頁存儲的數據會是:8K=8192字節-96字節(頁頭)-36字節(行偏移)=8060字節性能
因此每一頁用於存儲的實際大小爲8060字節.spa
好比上面AdventureWorks中的Person.Address表,經過SSMS看到這個表的數據空間爲:htm
咱們能夠經過公式大概推算出佔用了多少頁:2.250*1024*1024/8060(每頁的數據容量)≈293 - 表中非數據佔用的空間≈290(上圖中的邏輯讀取數)blog
SQL SERVER查詢執行的步驟若是從微觀來看,那將會很是多。這裏爲了講述邏輯讀等概念,我從比較高的抽象層次來看:內存
圖有些粗糙。資源
下面我解釋一下圖。當遇到一個查詢語句時,SQL SERVER會走第一步,分別爲生成執行計劃(佔用CPU和內存資源),同步的用估計的數據去磁盤中取得須要取的數據(佔用IO資源,這就是預讀),注意,兩個第一步是並行的,SQL SERVER經過這種方式來提升查詢性能.get
而後查詢計劃生成好了之後去緩存讀取數據.當發現緩存缺乏所須要的數據後讓緩存再次去讀硬盤(物理讀)同步
最後從緩存中取出全部數據(邏輯讀)。
下面我再經過一個簡單的例子說明一下:
這個估計的頁數數據能夠經過這個DMV看到:
當咱們第一次查詢完成後,再次進行查詢時,全部請求的數據這時已經在緩存中,SQL SERVER這時只要對緩存進行讀取就好了,也就是隻用進行邏輯讀: