標籤:
首先要理解邏輯讀和物理讀:
- 預讀:用估計資訊,去硬碟讀取資料到緩衝。預讀100次,也就是估計將要從硬碟中讀取了100頁資料到緩衝。
- 物理讀:查詢計劃產生好以後,如果緩衝缺少所需要的資料,讓緩衝再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁資料到緩衝。
- 邏輯讀:從緩衝中取出所有資料。邏輯讀100次,也就是從緩衝裡取到100頁資料。
SQL Server儲存的最小單位是頁,每一頁大小為8K,SQL Server對於頁的讀取是原子性的,要麼讀完一頁,要麼完全不讀。即使是僅僅要獲得一條資料,也要讀完一頁。而頁之間的資料群組織結構為B樹結構。所以SQL Server對於邏輯讀、預讀、物理讀的單位是頁。
樣本:
SQL SERVER一頁的總大小為:8K
但是這一頁儲存的資料會是:8K=8192位元組-96位元組(頁頭)-36位元組(行位移)=8060位元組
所以每一頁用於儲存的實際大小為8060位元組.
我們可以通過公式大概推算出佔用了多少頁:2032*1024/8060(每頁的資料容量)≈258- 表中非資料佔用的空間≈290(中的邏輯讀取數)
基本上,邏輯讀、物理讀、預讀都等於是掃描了多少個頁。
SQL SERVER查詢語句執行的順序:
當SQL Server執行一個查詢語句時,SQL Server會開始第一步,產生查詢計劃,查詢處理器需要讀取各個表的定義及表上各個索引的統計資訊,當查詢計劃產生後,真正交給查詢執行器執行時,SQL server 才會使用另外一個線程將查詢“可能需要的資料”從磁碟讀取的緩衝區中(前提是資料不在緩衝中),這就是預讀。SQL Server通過這種方式來提高查詢效能。
查詢計劃產生好了以後去緩衝讀取資料,當發現緩衝缺少所需要的資料後讓緩衝再次去讀硬碟(物理讀),然後從緩衝中取出所有資料(邏輯讀)。
估計的頁數可以通過DMV看到:select * from sys.dm_db_index_physical_stats... ,page_count 顯示為254;
此時再執行之前的查詢語句:
Storage engine notices pattern and kicks off read ahead, which starts to read data not yet requested into buffer pool. These are counted as read ahead reads, but not as logical or physical reads.Next time the scan or seek needs data, it is already in the buffer pool, so only logical io, no physical io.
從外國論壇上看的,不難理解,就是第二次查詢時,如果資料已經再緩衝中了,那麼只有邏輯讀,沒有物理讀了,因為直接在緩衝中可以找到這些資料了。
參考:http://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html
SQL Server 中的邏輯讀與物理讀