今天在網上看到有人在討論預讀和物理讀的區別,個人覺得物理讀和預讀都是io操作,都是需要從磁碟中讀取資料到記憶體,只是讀取的時間有所不同,之後查了一下msdn確認了這種想法。
預讀是在生成執行的同時去做的,通過這種方式可以提高io的效能。而物理讀是當執行計畫生成好後去快取讀取資料發現缺少資料之後才到磁碟讀取。當所有資料都從快取中可以讀取就變成邏輯讀。
下面舉個例子:
lineitem
表中大概儲存了
600w
資料,我們使用
set statistics io on:
set statistics io on
select count(*) from lineitem
table 'lineitem'. scan count 3, logical reads 22328, physicalreads 3,read-ahead reads20331, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
重複執行這條語句看到預讀已經變為
0,因為所有的資料已經在快取中了:
select count(*) from lineitem
table 'lineitem'. scan count 3, logical reads 22328, physicalreads 0,read-ahead reads 0,lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
對於預讀的解釋:
資料庫引擎支援稱為「預讀」的效能優化機制。預讀首先**執行查詢執行計畫所需的資料和索引頁,然後在查詢實際使用這些頁之前將它們讀入緩衝區快取記憶體。這樣可以讓計算和 i/o 重疊進行,從而充分利用 cpu 和磁碟。
預讀機制允許資料庫引擎從乙個檔案中讀取最多 64 個連續頁 (512kb)。該讀取作為緩衝區快取記憶體中相應數量(可能是非相鄰的)緩衝區的一次散播-聚集讀取來執行。如果此範圍內的任何頁在緩衝區快取記憶體中已存在,當讀取完成時,所讀取的相應頁將被放棄。如果相應頁在快取中已存在,也可以從任何一端「裁剪」頁的範圍。
關於預讀可以參考msdn:
SQL Server邏輯讀 預讀和物理讀
預讀 用估計資訊,去硬碟讀取資料到快取。預讀100次,也就是估計將要從硬碟中讀取了100頁資料到快取。物理讀 查詢計畫生成好以後,如果快取缺少所需要的資料,讓快取再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁資料到快取。邏輯讀 從快取中取出所有資料。邏輯讀100次,也就是從快取裡取到100頁資料。s...
SQLSERVER預讀邏輯讀物理讀
預讀 用估計資訊,去硬碟讀取資料到快取。預讀100次,也就是估計將要從硬碟中讀取了100頁資料到快取。物理讀 查詢計畫生成好以後,如果快取缺少所需要的資料,讓快取再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁資料到快取。邏輯讀 從快取中取出所有資料。邏輯讀100次,也就是從快取裡取到100頁資料。l...
SQL Server邏輯讀 預讀 物理讀
sql server邏輯讀 預讀 物理讀 sql server 儲存資料的方式 1.頁是最小的操作單元,也就是說從磁碟讀取資料庫的時候最少讀取一頁,每一頁的大小是8kb,sql server對於頁的讀取是原子性,要麼讀完一頁,要麼完全不讀,不會有中間狀態 2.區是8個連續的頁組成的,區是最小的分配單...