理解SQL SERVER中的邏輯讀,預讀和物理讀

SQL SERVER數據存儲的形式

      在談到幾種不一樣的讀取方式以前,首先要理解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查詢執行的步驟若是從微觀來看,那將會很是多。這裏爲了講述邏輯讀等概念,我從比較高的抽象層次來看:內存

      

      圖有些粗糙。資源

      下面我解釋一下圖。當遇到一個查詢語句時,SQL SERVER會走第一步,分別爲生成執行計劃(佔用CPU和內存資源),同步的用估計的數據去磁盤中取得須要取的數據(佔用IO資源,這就是預讀),注意,兩個第一步是並行的,SQL SERVER經過這種方式來提升查詢性能.get

      而後查詢計劃生成好了之後去緩存讀取數據.當發現緩存缺乏所須要的數據後讓緩存再次去讀硬盤(物理讀)同步

      最後從緩存中取出全部數據(邏輯讀)。

      下面我再經過一個簡單的例子說明一下:

      

      這個估計的頁數數據能夠經過這個DMV看到:

 

    

 

    當咱們第一次查詢完成後,再次進行查詢時,全部請求的數據這時已經在緩存中,SQL SERVER這時只要對緩存進行讀取就好了,也就是隻用進行邏輯讀:

    

相關文章
相關標籤/搜索