2017-04-13 106 views
0

大家好,優化SQL Server緩存

我有成千上萬的觸發器&存儲過程的數據庫。 所以我的客戶有一個很大的問題,每天都有一些對象從緩存中清除,然後我的應用程序的一些流程在第一次執行時花費一些時間(30,40秒),下次不到一秒鐘。但是如果他們等2-3小時,那麼物品會被清除,而我的流量會很慢。

所以我的問題是:有沒有辦法強制SQL Server緩存一些對象,因爲他很長時間來重新加載這些對象。我有很多的RAM(30千兆可用的,所以我想我可以緩存大量的對象)

感謝您提前爲您幫助

回答

0

那兒的方式來強制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以保持頁在內存中。但我不會用它去。您可以在此處閱讀以獲得更多信息

https://www.simple-talk.com/sql/database-administration/great-sql-server-debates-lock-pages-in-memory/