SQL Server對(duì)服務(wù)器內(nèi)存的使用策略是用多少內(nèi)存就占用多少內(nèi)存读拆,只用在服務(wù)器內(nèi)存不足時(shí),才會(huì)釋放一點(diǎn)占用的內(nèi)存纸镊,所以SQL Server 服務(wù)器內(nèi)存往往會(huì)占用很高倍阐。
Sql Server運(yùn)行時(shí)候的緩存:
1.數(shù)據(jù)緩存:執(zhí)行個(gè)查詢語句,Sql Server會(huì)將相關(guān)的數(shù)據(jù)頁(Sql Server操作的數(shù)據(jù)都是以頁為單位的)加載到內(nèi)存中來逗威, 下一次如果再次請(qǐng)求此頁的數(shù)據(jù)的時(shí)候峰搪,就無需讀取磁盤了,大大提高了速度凯旭。
2.執(zhí)行命令緩存:在執(zhí)行存儲(chǔ)過程概耻,自定函數(shù)時(shí),Sql Server需要先二進(jìn)制編譯再運(yùn)行罐呼,編譯后的結(jié)果也會(huì)緩存起來鞠柄, 再次調(diào)用時(shí)就無需再次編譯。
清除緩存的命令(直接執(zhí)行第四個(gè)命令清除所有緩存):
DBCC FREEPROCCACHE --清除存儲(chǔ)過程相關(guān)的緩存
DBCC FREESESSIONCACHE --會(huì)話緩存
DBCC FREESYSTEMCACHE('All') --系統(tǒng)緩存
DBCC DROPCLEANBUFFERS --所有緩存
注意:清除了緩存嫉柴,不會(huì)釋放SQL Server所占用的內(nèi)存厌杜,所以需要通過修改SQL Server內(nèi)存或重啟SQL Server服務(wù)器來釋放內(nèi)存。
修改SQL Server內(nèi)存:
優(yōu)化:使用以下語句查找出什么語句占內(nèi)存最高,針對(duì)占內(nèi)存高的語句進(jìn)行優(yōu)化
SELECT SS.SUM_EXECUTION_COUNT,
T.TEXT,
SS.SUM_TOTAL_ELAPSED_TIME AS '總和時(shí)間',
SS.SUM_TOTAL_WORKER_TIME AS '執(zhí)行耗時(shí)',
SS.SUM_TOTAL_LOGICAL_READS AS '總和邏輯讀數(shù)',
SS.SUM_TOTAL_LOGICAL_WRITES AS '總和邏輯寫'
FROM (SELECT S.PLAN_HANDLE,
SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,
SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,
SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,
SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,
SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES
FROM SYS.DM_EXEC_QUERY_STATS S
GROUP BY S.PLAN_HANDLE
) AS SS
CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T
ORDER BY SUM_TOTAL_LOGICAL_READS DESC