SQL Server 预读和物理读 的区别
今天在網(wǎng)上看到有人在討論預(yù)讀和物理讀的區(qū)別,個(gè)人覺得物理讀和預(yù)讀都是IO操作,都是需要從磁盤中讀取數(shù)據(jù)到內(nèi)存,只是讀取的時(shí)間有所不同,之后查了一下MSDN確認(rèn)了這種想法。
?
預(yù)讀是在生成執(zhí)行的同時(shí)去做的,通過這種方式可以提高IO的性能。而物理讀是當(dāng)執(zhí)行計(jì)劃生成好后去緩存讀取數(shù)據(jù)發(fā)現(xiàn)缺少數(shù)據(jù)之后才到磁盤讀取。當(dāng)所有數(shù)據(jù)都從緩存中可以讀取就變成邏輯讀。
?
下面舉個(gè)例子:
?
LINEITEM?表中大概存儲(chǔ)了600W數(shù)據(jù),我們使用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.
重復(fù)執(zhí)行這條語句看到預(yù)讀已經(jīng)變?yōu)?/span>0,因?yàn)樗械臄?shù)據(jù)已經(jīng)在緩存中了:
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.
?
對(duì)于預(yù)讀的解釋:
數(shù)據(jù)庫引擎支持稱為“預(yù)讀”的性能優(yōu)化機(jī)制。預(yù)讀首先預(yù)測執(zhí)行查詢執(zhí)行計(jì)劃所需的數(shù)據(jù)和索引頁,然后在查詢實(shí)際使用這些頁之前將它們讀入緩沖區(qū)高速緩存。這樣可以讓計(jì)算和 I/O 重疊進(jìn)行,從而充分利用 CPU 和磁盤。
預(yù)讀機(jī)制允許數(shù)據(jù)庫引擎從一個(gè)文件中讀取最多 64 個(gè)連續(xù)頁 (512KB)。該讀取作為緩沖區(qū)高速緩存中相應(yīng)數(shù)量(可能是非相鄰的)緩沖區(qū)的一次散播-聚集讀取來執(zhí)行。如果此范圍內(nèi)的任何頁在緩沖區(qū)高速緩存中已存在,當(dāng)讀取完成時(shí),所讀取的相應(yīng)頁將被放棄。如果相應(yīng)頁在緩存中已存在,也可以從任何一端“裁剪”頁的范圍。
?
關(guān)于預(yù)讀可以參考MSDN:?http://msdn.microsoft.com/zh-cn/library/ms191475.aspx
本文轉(zhuǎn)自 lzf328 51CTO博客,原文鏈接:http://blog.51cto.com/lzf328/1022526
總結(jié)
以上是生活随笔為你收集整理的SQL Server 预读和物理读 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java获得当前文件路径
- 下一篇: mysql 启动事件 启动触发器功能