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ì)占用很高。
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、柳南ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的柳南網(wǎng)站制作公司
Sql Server運(yùn)行時(shí)候的緩存:
1.數(shù)據(jù)緩存:執(zhí)行個(gè)查詢語(yǔ)句,Sql Server會(huì)將相關(guān)的數(shù)據(jù)頁(yè)(Sql Server操作的數(shù)據(jù)都是以頁(yè)為單位的)加載到內(nèi)存中來(lái), 下一次如果再次請(qǐng)求此頁(yè)的數(shù)據(jù)的時(shí)候,就無(wú)需讀取磁盤了,大大提高了速度。
2.執(zhí)行命令緩存:在執(zhí)行存儲(chǔ)過(guò)程,自定函數(shù)時(shí),Sql Server需要先二進(jìn)制編譯再運(yùn)行,編譯后的結(jié)果也會(huì)緩存起來(lái), 再次調(diào)用時(shí)就無(wú)需再次編譯。
清除緩存的命令(直接執(zhí)行第四個(gè)命令清除所有緩存):
DBCC FREEPROCCACHE --清除存儲(chǔ)過(guò)程相關(guān)的緩存
DBCC FREESESSIONCACHE --會(huì)話緩存
DBCC FREESYSTEMCACHE('All') --系統(tǒng)緩存
DBCC DROPCLEANBUFFERS --所有緩存
注意:清除了緩存,不會(huì)釋放SQL Server所占用的內(nèi)存,所以需要通過(guò)修改SQL Server內(nèi)存或重啟SQL Server服務(wù)器來(lái)釋放內(nèi)存。
修改SQL Server內(nèi)存:
優(yōu)化:使用以下語(yǔ)句查找出什么語(yǔ)句占內(nèi)存最高,針對(duì)占內(nèi)存高的語(yǔ)句進(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
轉(zhuǎn)自:
1、最直接的就是看哪些數(shù)據(jù)可以不用存儲(chǔ)就直接刪除了,設(shè)計(jì)系統(tǒng)時(shí)就應(yīng)該考慮這些問(wèn)題的
2、如果有過(guò)期數(shù)據(jù)備份后刪除吧,或者過(guò)期的過(guò)程數(shù)據(jù),也可以備份后刪除
3、可能是索引碎片的原因,另外就是非聚集索引占用的空間,可以試一下先重建聚集索引,然后看看空間是否變小了很多,若是,則需要重建全部索引
sql server 在查詢大數(shù)據(jù)量的數(shù)據(jù)時(shí),總會(huì)占用大量的內(nèi)存,并且居高不下,一不小心就會(huì)死機(jī)。
下面這個(gè)是我從網(wǎng)上找到的:
當(dāng)你查詢數(shù)據(jù)的數(shù)據(jù)量比較大時(shí),sqlserver會(huì)把查詢結(jié)果緩存在內(nèi)存中,保證你下次查詢同樣的記錄時(shí)會(huì)很快得到結(jié)果,所以內(nèi)存使用量會(huì)激增。
在你完成此次查詢后,sqlserver不會(huì)馬上釋放內(nèi)存,數(shù)據(jù)會(huì)仍然放在內(nèi)存中,這是sqlserver的優(yōu)化策略,sqlserver會(huì)不斷地占用你的系統(tǒng)內(nèi)存,來(lái)加快sqlserver的運(yùn)行速度,當(dāng)你的系統(tǒng)中的其它服務(wù)也需要內(nèi)存時(shí),它才會(huì)自動(dòng)釋放部分內(nèi)存。一句話,sqlserver不會(huì)讓你的系統(tǒng)有閑置的內(nèi)存,除非你設(shè)置sqlserver的最大內(nèi)存使用量。這樣也沒(méi)什么不好,如果你的系統(tǒng)很大,單獨(dú)給sqlserver一臺(tái)機(jī)器,這樣會(huì)提高它的性能。
如果你只是開(kāi)發(fā)用,要想讓sqlserver釋放內(nèi)存,重啟sqlserver的服務(wù)就行了。如果不想讓sqlserver占用太多內(nèi)存,設(shè)置sqlserver的最大內(nèi)存占用量.
1、獲取SQL Server允許同時(shí)用戶連接的最大數(shù)
SELECT @@MAX_CONNECTIONS
2、獲取當(dāng)前指定數(shù)據(jù)庫(kù)的連接信息
SELECT * FROM master.dbo.sysprocesses WHERE dbid IN
(
SELECT dbid FROM master.dbo.sysdatabases
WHERE NAME='YourDataBaseName'
)
--根據(jù)需要更改YourDataBaseName
SELECT * FROM master.dbo.sysprocesses WHERE DB_NAME(dbid) = 'YourDataBaseName'
3、獲取當(dāng)前SQL服務(wù)器所有的連接詳細(xì)信息
SELECT * FROM sysprocesses
以上查詢結(jié)果包含了:系統(tǒng)進(jìn)程和用戶進(jìn)程。
如果只是想查用戶進(jìn)程的話則需采用下面的方法
4、獲取自上次啟動(dòng) SQL Server服務(wù) 以來(lái)連接或試圖連接的次數(shù)
SELECT @@CONNECTIONS
這個(gè)剛開(kāi)始會(huì)有點(diǎn)誤解,認(rèn)為是當(dāng)前SQL Server服務(wù)器當(dāng)前所有的連接數(shù)。需要重點(diǎn)注意。