淺談SQL Server邏輯讀、物理讀和預讀

【摘要】數據庫

SQL Server數據庫進行性能優化時,有一個重要的工做是優化IO開銷。經過開啓Statistics IO,咱們能夠了解到語句執行的IO開銷,包含物理讀、邏輯讀、預讀等。而咱們是否瞭解這三者的區別和聯繫呢,相信不少人都不是很理解,下面咱們一塊兒來探索這三者究竟分別表明着什麼。緩存

【正文】性能優化

  SQLServer數據存儲方式

SQL Server的數據庫包括數據文件和日誌文件,一個數據庫能夠有一個或多個數據文件或日誌文件。ide

全部的數據都存儲在數據文件中,而數據文件能夠劃分爲再小的單元,咱們稱爲頁。頁是最小的操做單元,也就是說從磁盤讀取數據庫的時候最少讀取一頁,每一頁的大小是8KB。另外一個概念是區,區是8個連續的頁組成的,區是最小的分配單元,當須要空間時最少分配一個區的空間。性能

wKioL1Q7aeLiUvbpAAC01XY4PEY362.jpg

  、剖析SQLServer IO統計信息

2.1      初識邏輯讀、物理讀和預讀

咱們先舉一個例子。優化

wKiom1Q7abrSlJRyAAF_waI4tYM244.jpg

第一次查詢數據庫AdventureWorks下的表Sales.SalesOrderDetail時,顯示「邏輯讀取1240次,物理讀取5次,預讀1250次」。spa

不管是邏輯讀、物理讀仍是預讀的單位都是頁,上次咱們已經介紹過了。SQL Server對於頁的讀取是原子性的,要麼讀完一頁,要麼徹底不讀,而且每一頁的大小是8KB日誌

預讀:在查詢計劃生成過程當中,用估計信息,去硬盤讀取數據到緩存中。預讀1250次,也就是估計將要從硬盤中讀取了1250頁數據並存放到緩存中。blog

物理讀:查詢計劃生成好之後,若是緩存缺乏所須要的數據,再從硬盤中讀取缺乏的數據到緩存中。get

邏輯讀:從緩存中取出全部數據。邏輯讀1240次,也就是從緩存裏取到1240頁數據。

2.2      語句執行過程剖析

咱們再來回顧上面的查詢經歷的過程:

1.     首先在生成執行計劃過程當中,SQL Server首先從硬盤預計了1250次,也就是讀取了1250*8KB=10,000KB的數據而且存入緩存中(也就是預讀的過程

2.     當執行查詢計劃時,發現緩存的數據還不夠。則繼續從硬盤讀取額外需求的數據並存入緩存中(也就是物理讀的過程

3.     接着SQL Server再從緩存讀取所有須要的數據並返回到客戶端。(也就是邏輯讀的過程

wKioL1Q7ag7xISh4AAConbBVTNo351.jpg

2.3      邏輯讀、物理讀和預讀的關係

當咱們再次運行上面的查詢語句時,獲得的信息以下:

wKioL1Q7ah7Q7L6WAAGG7igNQVQ071.jpg

咱們能夠發現,此次沒有物理讀取和預讀,只有邏輯讀,這是爲何呢?咱們前面已經剖析過原理了,由於第二次查詢時直接從緩存就能夠讀取到所須要的數據。

按照咱們介紹的理論,貌似邏輯讀取的次數=物理讀取的次數+預讀的次數。但細心的讀者會發現,第一次查詢時「邏輯讀取1240次,物理讀取5次,預讀1250次」,咱們發現邏輯讀取的次數不等於物理讀取的次數與預讀的次數之和。這又是爲何呢?

1.     首先須要說明的是,邏輯讀取的次數並不必定等於物理讀取的次數與預讀的次數之和。一個很簡單例子是第二次查詢時物理讀取和預讀都是0。實際上,預讀是按照估計的信息去讀取數據,所以讀取的頁數並不必定準確,可能多於實際的頁數也可能少於實際的頁數。

2.     若是預讀的頁數包含了所有的數據,那麼就不會有物理讀取

3.     有時候會出現邏輯讀取的次數大於物理讀取的次數與預讀的次數之和。這是由於在預讀以前緩存中已經存在部分須要的數據。

  、小結

理解邏輯讀、物理讀和預讀這三個概念,關鍵是理解語句的查詢過程以及哪個步驟是從緩存讀取數據、哪個步驟是從硬盤讀取數據、哪個步驟又是根據估計的信息去讀取數據,這樣也就能理解這三個概念了。

邏輯讀、物理讀和預讀這三個的次數並不存在絕對的數量關係,關鍵仍是要理論語句的查詢過程。

在對語句進行優化時,重點是優化邏輯讀取的次數。經過優化語句來減小邏輯讀取的次數,從而也就減小IO開銷。

相關文章
相關標籤/搜索