要理解邏輯讀、物理讀、預讀這三個概念,先要搞懂sql server的資料儲存方式。
sql server資料庫包括資料檔案和日誌檔案,乙個資料庫可以有乙個或多少資料檔案、日誌檔案。所有的資料儲存在資料檔案中,資料檔案可以劃分為再小的單元,我們稱為「頁」。每頁大小8k。8個頁面構成乙個區。sql server對於頁的讀取是最原子性,要麼讀完一頁,要麼完全不讀。頁之間的資料組織結構為b樹。 所以sql server對於邏輯讀、物理讀、預讀的單位都是頁。
2.1 初識三讀
先來看個例子。示例資料庫adventureworks。查詢sales.salesorderdetail
從截圖中可以看出,這裡讀取多少次也就是讀取了【多少頁】資料。這個也是我一開始沒搞懂的地方。
預讀:在查詢計畫生成的過程中,用估計的資訊去硬碟讀取資料到快取中,預讀1242頁,也就是從硬碟中讀取了1242頁放到了快取中。
物理讀:查詢計畫生成好以後,如果快取缺少所需要的資料,再從硬碟裡讀取缺少的資料到快取裡。
邏輯讀:從快取中讀取資料。邏輯讀1240次,也就是從快取中讀取1240頁資料。
2.2 邏輯讀、物理讀、預讀的關係
再次執行上面的語句得出以下結果
從圖中可以看出,這次沒有屋裡讀取和預讀次數,只有邏輯讀取次數,根據前面的概念我們可以分析出:第二次查詢可以直接從快取中讀取所需要的資料。 按照我們的理論,貌似邏輯讀取次數=物理讀取次數+預讀次數。但你會發現前面我們1240並不等於1242+3.這又是為什麼呢?
1、首先要說明,邏輯讀取次數並不絕對等於物理讀取次數和預讀次數之和。第二次查詢物理讀取次數和預讀次數都是0。預讀是按照估計的資訊去讀取資訊,因此讀取的頁數並不一定準確,可能多於也可能少於實際的頁數。
2、如果預讀的頁數包括了全部資料,那麼就不會有物理讀取次數。
3、有時候出現邏輯讀取次數大於物理讀取次數加上預讀次數,這是因為在預讀之前快取中已經存在部分需要的資料。
當sql server執行乙個查詢時,sql server會開始第一步,生成執行計畫。同時用估計的資料去硬碟讀取資料(預讀)。這兩個第一步是並行的,sql server通過這種方式來提高查詢效能。執行計畫生成好以後去快取讀取資料。當發現快取缺少所需要的資料後讓快取再次去讀硬碟(物理讀)。然後從快取中讀取所有資料(邏輯讀)。
估計的頁數也可以從這個dmv中查詢。如果第二次快取後可使用dbcc dropcleanbuffers清理快取(生產慎用)。
select理解邏輯讀、物理讀、預讀這三個概念主要是理解語句的查詢過程以及那個步驟是去快取資料、那個步驟又是去硬碟讀取資料、那個步驟又是根據估計的資訊去讀取資料。從應用的角度來說這三個數量並不是絕對的數量加和關係,關鍵還是要看理論語句的查詢過程。在對語句進行優化時重點還是邏輯讀的次數,通過優化語句來檢查邏輯讀的次數來減少io開銷。page_count
from sys.dm_db_index_physical_stats
(db_id('adventureworks2008r2'),object_id('sales.salesorderdetail'),null,null,'sampled')
SQLSERVER預讀邏輯讀物理讀
預讀 用估計資訊,去硬碟讀取資料到快取。預讀100次,也就是估計將要從硬碟中讀取了100頁資料到快取。物理讀 查詢計畫生成好以後,如果快取缺少所需要的資料,讓快取再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁資料到快取。邏輯讀 從快取中取出所有資料。邏輯讀100次,也就是從快取裡取到100頁資料。l...
SQL Server邏輯讀 預讀 物理讀
sql server邏輯讀 預讀 物理讀 sql server 儲存資料的方式 1.頁是最小的操作單元,也就是說從磁碟讀取資料庫的時候最少讀取一頁,每一頁的大小是8kb,sql server對於頁的讀取是原子性,要麼讀完一頁,要麼完全不讀,不會有中間狀態 2.區是8個連續的頁組成的,區是最小的分配單...
oracle的邏輯讀 物理讀總結
一 物理讀 把資料從資料塊讀取到 buffer cach e中1 第一次查詢乙個表t select from t 2 第二次查詢 select from t 第一次查詢有6次物理讀,第二次查詢有0個物理讀。當資料塊第一次讀取到,就會快取到buffer cach e 中,而第二次讀取和修改該資料塊時就...