在執(zhí)行任何查詢時(shí),SQL Server都會(huì)將數(shù)據(jù)讀取到內(nèi)存,數(shù)據(jù)使用之后,不會(huì)立即釋放,而是會(huì)緩存在內(nèi)存Buffer中,當(dāng)再次執(zhí)行相同的查詢時(shí),如果所需數(shù)據(jù)全部緩存在內(nèi)存中,那么SQL Server不會(huì)產(chǎn)生Disk IO操作,立即返回查詢結(jié)果,這是SQL Server的性能優(yōu)化機(jī)制。

一,主要的內(nèi)存消費(fèi)者(Memory Consumer)

1,數(shù)據(jù)緩存(Data Cache)

Data Cache是存儲(chǔ)數(shù)據(jù)頁(yè)(Data Page)的緩沖區(qū),當(dāng)SQL Server需要讀取數(shù)據(jù)文件(File)中的數(shù)據(jù)頁(yè)(Data Page)時(shí),SQL Server會(huì)把整個(gè)Page都調(diào)入內(nèi)存(內(nèi)存中的一個(gè)Page叫做buffer),Page是數(shù)據(jù)訪問的最小單元。

當(dāng)用戶修改了某個(gè)Page上的數(shù)據(jù)時(shí),SQL Server 會(huì)先在內(nèi)存中修改Buffer,但是不會(huì)立即將這個(gè)數(shù)據(jù)葉寫回硬盤,而是等到CheckPoint或lazy Writer進(jìn)程運(yùn)行時(shí)集中處理。當(dāng)用戶讀取某個(gè)Page后,如果SQL Server沒有內(nèi)存壓力,它不會(huì)在內(nèi)存中刪除這個(gè)Page,因?yàn)閮?nèi)存中的數(shù)據(jù)頁(yè)始終存放著數(shù)據(jù)的最新狀態(tài),如果有其他用戶使用這個(gè)Page,SQL Server 不需要從硬盤中讀取一次,節(jié)省語句執(zhí)行的時(shí)間。理想情況是SQL Server將用戶需要訪問的所有數(shù)據(jù)都緩存在內(nèi)存中,SQL Server 永遠(yuǎn)不需要去硬盤讀取數(shù)據(jù),只需要在CheckPoint 或 lazy Write運(yùn)行時(shí)把修改過的頁(yè)面寫回硬盤即可

2,查詢計(jì)劃緩存(Query Plan Cache)

存儲(chǔ)查詢語句和存儲(chǔ)過程的執(zhí)行計(jì)劃,以供重用,而不需要重新編譯(Compile),因?yàn)榫幾g查詢語句產(chǎn)生執(zhí)行計(jì)劃是一個(gè)非常耗費(fèi)資源的過程。

二,查看內(nèi)存消耗

在SQL Server中,只有內(nèi)存書記員(Memory Clerk)能夠分配內(nèi)存,Memory Clerk會(huì)記錄已經(jīng)分配內(nèi)存的數(shù)量,任何一個(gè)需要使用內(nèi)存的對(duì)象,必須創(chuàng)建自己的Memory Clerk,并使用該Memory clerk來分配內(nèi)存。

1,查看Memory clerk分配的內(nèi)存量

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn) View Code

對(duì)于內(nèi)存結(jié)點(diǎn)64,只在DAC中使用。

網(wǎng)友評(píng)論