2017-04-13 20 views
0

こんにちは皆、最適化SQL Serverのキャッシュ

は、私は、トリガー&ストアドプロシージャの何千ものデータベースを持っています。 私のクライアントは大きな問題を抱えているため、毎日オブジェクトの一部がキャッシュから消去されてから、アプリケーションの一部のフローが最初に実行されたときに(30,40秒)、次回に1秒未満かかる場合があります。しかし、彼らが2-3hのように待っていると、オブジェクトはクリアされ、フローは遅くなります。

私の質問は:彼はこれらのオブジェクトを再読み込みするのに非常に長いので、SQL Serverがオブジェクトをキャッシュするように強制する方法はありますか。いくつかのオブジェクトをキャッシュするために、SQL Serverを強制的に

答えて

0

のが道を助けて、私は多くのRAMを持っている(30ギガが利用できるので、私は多数のオブジェクトをキャッシュすることができると思います)

はあなたのために、事前によっていただきありがとうございます彼はそれらのオブジェクトにまとめて

をリロードすることは非常に長いです、No.ButあなたがのSQLServer 2012上にある場合、あなたは以下の

希望がメモリの問題

に対処するのに役立ちますけれどもインメモリOLTPは、オブジェクトを使用することができますので、

私は多くのRAMを持っている(30ギガが利用できるので、私は多数のオブジェクトをキャッシュすることができると思います)

あなたは十分なRAMを持っているにもかかわらず、バッファー・プールが使用できるキャッシュの量が依存するだろうMAXサーバーのメモリ構成なので、私はあなたが正しくその値を設定したら、あなたは、このキャッシュは、多くのものに使用されることを認識しておく必要があり、正しく

それを設定していることを前提としていますが、以下の主なもの

です

1.ページ
データベースが使用している10 2.Executionプランキャッシュ

あなたは、そのサーバーでデータベースの多くを持っているし、実行している多くのクエリがある場合は、あなたの30ギガバイトは、クエリの下に使用して...

は十分ではないかもしれない、あなたが識別することができ、より多くのメモリ

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; 

は、オブジェクトによって、あなたは今、あなたが知っていることを、データベースがより多くのメモリを消費している、もしCあまりに

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 

を消費している、あなたは、さらにスクリプトの下から無駄を排除しようとすることができるので、メモリがサーバー

に使用されているかの完全なアイデアを持っているのを見データベースのAdhocプランからキャッシュエントリを削除するKimberely Trippさんの:Plan cache and optimizing for adhoc workloads

以下のスクリプトは、単一のオブジェクトプランによるメモリ使用量を示しています。同じリンクをチェックし、私はそれで行くことはありませんメモリー.Butにページを維持するために、SQL Serverを強制するだけでなく、あなたがメモリ内のページのロックを使用することができますまた、

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 

これらのエントリを削除するスクリプトを、持っていますあなたはここで詳しい情報を読むことができます。

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