SQL SERVER中的邏輯讀取,物理讀取,以及預讀的理解

在SQLSERVER查詢分析器中,當咱們用Set Statistics on 語句來統計SQL語句或者存儲過程I/O的時候,html

SQLSERVER會顯示幾個概念去詞語:邏輯讀取,物理讀取,預讀。緩存

以下:性能

(1 行受影響)
表 't2'。掃描計數 1,邏輯讀取 3282 次,物理讀取 44 次,預讀 3282 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。spa

那麼,這幾個詞語表明什麼意思呢?咱們怎麼根據這些來了解SQL語句或者存儲過程的I/O過程呢?htm

預讀:用於估計信息,去硬盤讀取數據到緩存。blog

物理讀:查詢計劃生成之後,若是發現緩存缺乏所須要的數據,讓緩存再次去讀硬盤數據。若是內存裏沒有緩存數據或者執行計劃(若是SQL語句發生了改變,內存

那麼執行計劃將不能重用,須要從新生成新的執行計劃),那麼SQLSERVER就要去硬盤讀取這些數據,這個時候就是物理讀取,咱們你們都知道,硬盤速度select

與內存速度根本不在一個數量級上,因此物理讀是比較慢的。並行

邏輯讀:SQLSERVER去內存裏的緩存取數據或者執行計劃,因此邏輯讀是比較快的。im

SQLSERVER存儲的最小單位是頁,每一頁大小爲8K,即8*1024=8192字節,SQLSERVER對頁的讀取是原子性的,即要麼讀完一頁,要麼徹底不讀。即便

僅僅要得到一條數據,也要讀完該頁,而頁之間的數據組織結構爲B樹結構。因此SQLSERVER對於邏輯讀,物理讀,預讀的單位是頁。

先來看一個查詢:

DBCC DROPCLEANBUFFERS  --清空緩存

SET STATISTICS IO ON     --開啓IO統計

SELECT * FROM SAMPLE   --查詢

顯示消息以下:

(147517 行受影響)

表'SAMPLE'。掃描計數 1,邏輯讀取2237次,物理讀取6次,預讀2226次,lob讀取0次

上表的大小事17.406M。

每一頁存儲的數據是8K=8192字節-96字節(頁頭)-36字節(行偏移)=8060字節。

17.406*1024*1024/8060約等於2264.

另外表中還有一些非數據佔用的空間,所以上式的結果約等於邏輯讀次數。

基本上,邏輯讀,物理讀,預讀都等因而掃描了多少個頁。

SQLSERVER的查詢從理解各類讀的步驟來看,能夠理解爲下圖

經過上圖來解釋下各類讀的方式:

SQLSERVER執行一個查詢語句的時候,SQLSERVER會執行第一個步驟,即生成查詢計劃,同時用估計的數據去磁盤讀取數據(預讀)

,這兩個都是第一步,是並行的。SQLSERVER經過這種方式來提升查詢性能。

當查詢計劃生成好之後,開始去緩存讀取數據,當發現緩存缺乏所須要的數據的時候,讓緩存再次去硬盤讀取數據(物理讀),而後從緩存

中取出全部數據(邏輯讀)。

估計的頁數能夠經過DMV來看到

select pagecount from sys.dm_db_index_physical_stats

(DB_ID('TESTDATACENTER'),OBJECT_ID('SAMPLE'),null,null,'sampled')

顯示結果以下:

SQLSERVER就是根據這個數值進行預讀的。

若是咱們此時再執行上面的查詢語句

select * from sample  --查詢

看到消息以下:

(147517 行受影響)

表'SAMPLE'。掃描計數1,邏輯讀取2237次,物理讀取0次,預讀0次,lob邏輯讀取0次。

讀者也許不明白了,爲何此次所有都是邏輯讀取呢?

答案是由於剛纔執行過這樣一個查詢,執行計劃與數據都在緩存當中,因此只須要從緩存中讀取就能夠了,

不須要再讀取硬盤。

 

本文系本身消化並轉載

地址:http://www.studyofnet.com/news/94.html。

相關文章
相關標籤/搜索