在執(zhí)行任何查詢時,SQL Server都會將數(shù)據(jù)讀取到內(nèi)存,數(shù)據(jù)使用之后,不會立即釋放,而是會緩存在內(nèi)存Buffer中,當再次執(zhí)行相同的查詢時,如果所需數(shù)據(jù)全部緩存在內(nèi)存中,那么SQL Server不會產(chǎn)生Disk IO操作,立即返回查詢結(jié)果,這是SQL Server的性能優(yōu)化機制。
一,主要的內(nèi)存消費者(Memory Consumer)
1,數(shù)據(jù)緩存(Data Cache)
Data Cache是存儲數(shù)據(jù)頁(Data Page)的緩沖區(qū),當SQL Server需要讀取數(shù)據(jù)文件(File)中的數(shù)據(jù)頁(Data Page)時,SQL Server會把整個Page都調(diào)入內(nèi)存(內(nèi)存中的一個Page叫做buffer),Page是數(shù)據(jù)訪問的最小單元。
當用戶修改了某個Page上的數(shù)據(jù)時,SQL Server 會先在內(nèi)存中修改Buffer,但是不會立即將這個數(shù)據(jù)葉寫回硬盤,而是等到CheckPoint或lazy Writer進程運行時集中處理。當用戶讀取某個Page后,如果SQL Server沒有內(nèi)存壓力,它不會在內(nèi)存中刪除這個Page,因為內(nèi)存中的數(shù)據(jù)頁始終存放著數(shù)據(jù)的最新狀態(tài),如果有其他用戶使用這個Page,SQL Server 不需要從硬盤中讀取一次,節(jié)省語句執(zhí)行的時間。理想情況是SQL Server將用戶需要訪問的所有數(shù)據(jù)都緩存在內(nèi)存中,SQL Server 永遠不需要去硬盤讀取數(shù)據(jù),只需要在CheckPoint 或 lazy Write運行時把修改過的頁面寫回硬盤即可
2,查詢計劃緩存(Query Plan Cache)
存儲查詢語句和存儲過程的執(zhí)行計劃,以供重用,而不需要重新編譯(Compile),因為編譯查詢語句產(chǎn)生執(zhí)行計劃是一個非常耗費資源的過程。
二,查看內(nèi)存消耗
在SQL Server中,只有內(nèi)存書記員(Memory Clerk)能夠分配內(nèi)存,Memory Clerk會記錄已經(jīng)分配內(nèi)存的數(shù)量,任何一個需要使用內(nèi)存的對象,必須創(chuàng)建自己的Memory Clerk,并使用該Memory clerk來分配內(nèi)存。
1,查看Memory clerk分配的內(nèi)存量
View Code
對于內(nèi)存結(jié)點64,只在DAC中使用。
延伸閱讀
學習是年輕人改變自己的最好方式