初談SQL Server邏輯讀、物理讀、預讀


前言

       本文涉及的內容均不是原創,是記錄自己在學習IO、執行計划的過程中學習其他大牛的博客和心得並記錄下來,之所以想寫下來是為了記錄自己在追溯的過程遇到的幾個問題,並把這些問題弄清楚。 本章最后已貼出原文地址。

 

1、SQL Server的數據存儲方式

     要理解邏輯讀、物理讀、預讀這三個概念,先要搞懂SQL Server的數據存儲方式。

     SQL Server數據庫包括數據文件和日志文件,一個數據庫可以有一個或多少數據文件、日志文件。所有的數據存儲在數據文件中,數據文件可以划分為再小的單元,我們稱為“頁”。每頁大小8k。8個頁面構成一個區。SQL Server對於頁的讀取是最原子性,要么讀完一頁,要么完全不讀。頁之間的數據組織結構為B樹。 所以SQL Server對於邏輯讀、物理讀、預讀的單位都是頁。

 

2、剖析IO統計信息

2.1 初識三讀

     先來看個例子。示例數據庫AdventureWorks。查詢Sales.SalesOrderDetail

     從截圖中可以看出,這里讀取多少次也就是讀取了【多少頁】數據。這個也是我一開始沒搞懂的地方。

    預讀:在查詢計划生成的過程中,用估計的信息去硬盤讀取數據到緩存中,預讀1242頁,也就是從硬盤中讀取了1242頁放到了緩存中。

    物理讀:查詢計划生成好以后,如果緩存缺少所需要的數據,再從硬盤里讀取缺少的數據到緩存里。

    邏輯讀:從緩存中讀取數據。邏輯讀1240次,也就是從緩存中讀取1240頁數據。

 

2.2 邏輯讀、物理讀、預讀的關系

     再次運行上面的語句得出以下結果

     從圖中可以看出,這次沒有屋里讀取和預讀次數,只有邏輯讀取次數,根據前面的概念我們可以分析出:第二次查詢可以直接從緩存中讀取所需要的數據。 按照我們的理論,貌似邏輯讀取次數=物理讀取次數+預讀次數。但你會發現前面我們1240並不等於1242+3.這又是為什么呢?

     1、首先要說明,邏輯讀取次數並不絕對等於物理讀取次數和預讀次數之和。第二次查詢物理讀取次數和預讀次數都是0。預讀是按照估計的信息去讀取信息,因此讀取的頁數並不一定准確,可能多於也可能少於實際的頁數。

     2、如果預讀的頁數包括了全部數據,那么就不會有物理讀取次數。

     3、有時候出現邏輯讀取次數大於物理讀取次數加上預讀次數,這是因為在預讀之前緩存中已經存在部分需要的數據。

 

3、看圖理解【邏輯讀】、【物理讀】、【預讀】

 

 

      當SQL Server執行一個查詢時,SQL Server會開始第一步,生成執行計划。同時用估計的數據去硬盤讀取數據(預讀)。這兩個第一步是並行的,SQL Server通過這種方式來提高查詢性能。執行計划生成好以后去緩存讀取數據。當發現緩存缺少所需要的數據后讓緩存再次去讀硬盤(物理讀)。然后從緩存中讀取所有數據(邏輯讀)。

      估計的頁數也可以從這個DMV中查詢。如果第二次緩存后可使用DBCC DROPCLEANBUFFERS清理緩存(生產慎用)。

SELECT 
  page_count
  FROM sys.dm_db_index_physical_stats
  (DB_ID('AdventureWorks2008R2'),OBJECT_ID('Sales.SalesOrderDetail'),NULL,NULL,'sampled')

 

總結

      理解邏輯讀、物理讀、預讀這三個概念主要是理解語句的查詢過程以及那個步驟是去緩存數據、那個步驟又是去硬盤讀取數據、那個步驟又是根據估計的信息去讀取數據。從應用的角度來說這三個數量並不是絕對的數量加和關系,關鍵還是要看理論語句的查詢過程。在對語句進行優化時重點還是邏輯讀的次數,通過優化語句來檢查邏輯讀的次數來減少IO開銷。

參考資料

http://www.canway.net/Original/shujuku/012CE2016.html

http://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html

http://www.cnblogs.com/kissdodog/archive/2013/06/25/3155016.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM