大家好,優化SQL Server緩存
我有成千上萬的觸發器&存儲過程的數據庫。 所以我的客戶有一個很大的問題,每天都有一些對象從緩存中清除,然後我的應用程序的一些流程在第一次執行時花費一些時間(30,40秒),下次不到一秒鐘。但是如果他們等2-3小時,那麼物品會被清除,而我的流量會很慢。
所以我的問題是:有沒有辦法強制SQL Server緩存一些對象,因爲他很長時間來重新加載這些對象。我有很多的RAM(30千兆可用的,所以我想我可以緩存大量的對象)
感謝您提前爲您幫助
大家好,優化SQL Server緩存
我有成千上萬的觸發器&存儲過程的數據庫。 所以我的客戶有一個很大的問題,每天都有一些對象從緩存中清除,然後我的應用程序的一些流程在第一次執行時花費一些時間(30,40秒),下次不到一秒鐘。但是如果他們等2-3小時,那麼物品會被清除,而我的流量會很慢。
所以我的問題是:有沒有辦法強制SQL Server緩存一些對象,因爲他很長時間來重新加載這些對象。我有很多的RAM(30千兆可用的,所以我想我可以緩存大量的對象)
感謝您提前爲您幫助
那兒的方式來強制SQL Server緩存某些對象因爲他很長時間重新加載這些對象
總結,No.But如果你對SQLServer的2012年,您可以使用InMemory OLTP對象雖然
低於希望可以幫助您在處理內存問題
我有很多的RAM(30千兆可用的,所以我想我可以緩存大量的對象)
即使你有足夠的內存,緩存量緩衝池可以使用將取決於最大服務器內存配置,所以我假設你已經正確設置
一旦你設定值正確,你必須知道的是,這個緩存將被用於很多事情,但下面是主要的
1.網頁
2.Execution計劃緩存
如果你有大量的在服務器的數據庫和有運行許多查詢,您的30GB可能不夠..用下面的查詢
,您可以識別,該數據庫使用更多的內存
SELECT COUNT(*) *8 AS memoryusedKB
,CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(database_id)
END AS database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) ,database_id
ORDER BY memoryused DESC;
,如果你想分離,通過對象,就可以做到這一點
SELECT COUNT(*)AS cached_pages_count
,name ,index_id
FROM sys.dm_os_buffer_descriptors AS bd
INNER JOIN
(
SELECT object_name(object_id) AS name
,index_id ,allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.hobt_id
AND (au.type = 1 OR au.type = 3)
UNION ALL
SELECT object_name(object_id) AS name
,index_id, allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.partition_id
AND au.type = 2
) AS obj
ON bd.allocation_unit_id = obj.allocation_unit_id
WHERE database_id = DB_ID()
GROUP BY name, index_id
ORDER BY cached_pages_count DESC;
現在,你知道,哪個數據庫消耗更多的內存,你ç一看其內存池消耗更多的內存
select type,sum(pages_kb)*128 as memoryusedMB
from sys.dm_os_memory_clerks
group by type
在這個時間點,你有記憶是如何在你的服務器採用全主意
所以你可以嘗試使用下面的腳本來進一步消除浪費Kimberely特里普,這將刪除數據庫緩存條目即席計劃:Plan cache and optimizing for adhoc workloads
下面的腳本爲您提供了由單一的對象計劃的內存使用情況,你可以看到,如果這是您可以接受。檢查相同的鏈接,你將有一個腳本刪除這些條目以及
SELECT objtype AS [CacheType],
COUNT_BIG(*) AS [Total Plans],
SUM(CAST(size_in_bytes AS DECIMAL(18, 2)))/1024/1024 AS [Total MBs],
AVG(usecounts) AS [Avg Use Count],
SUM(CAST((CASE WHEN usecounts = 1 THEN size_in_bytes
ELSE 0
END) AS DECIMAL(18, 2)))/1024/1024 AS [Total MBs – USE Count 1],
SUM(CASE WHEN usecounts = 1 THEN 1
ELSE 0
END) AS [Total Plans – USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs – USE Count 1] DESC
而且可以使用鎖定內存頁,這迫使SQL Server以保持頁在內存中。但我不會用它去。您可以在此處閱讀以獲得更多信息