1. 程式人生 > >T-SQL執行內幕(11)——Read Ahead

T-SQL執行內幕(11)——Read Ahead

    每當操作讀取頁的資料,意味著這些資料需要固定到快取(buffer pool)中。這個時候可能會導致操作被阻塞,因為當所需要的資料不在記憶體時,需要把資料從磁碟載入記憶體,這個時候操作需要等待頁從磁碟搜尋並載入記憶體。如果由於系統負擔很重或者載入的量很大,磁碟I/O響應不及時,那麼此時操作就會被阻塞(stall),效能將會暴跌。

    從現實生活來說,我們對於這種情況,可以通過一次載入相關的大量資料減少多次載入,同時讓記憶體足夠大也能避免多次載入,最後就是增加磁碟I/O子系統的效能。

    為了解決這種問題,SQL Server引入了read ahead技術,本質上就是先載入前面沒有被引用,但是又很快會被引用的頁。它在操作實際訪問這些頁並讀取行之前,根據掃描操作的要求使用非同步方式提前發出請求。

    有時候如果使用SET STATISTICS IO 來檢視語句IO行為時,可能會看到類似:

Table'MythOne'. Scan count 1, logical reads 1495, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    對於Read Ahead的深入介紹可以看下面三篇,同樣,read ahead很難通過使用者干預來影響,我們能做的就是完善硬體效能,改進寫法、索引設計。