インスタンスの大きいメモリ使用量を最適化する

このドキュメントでは、Cloud SQL for SQL Server インスタンスが、アンダープロビジョニングされたインスタンスの Recommender によってメモリ消費量が多いと判断された場合、そのインスタンスを確認し、最適化する方法について説明します。

SQL Server メモリ

SQL Server のメモリは次のように分類できます。

キャッシュ

これらは、データベース ページやストアド プロシージャなど、再読み込みできるディスク上のオブジェクトです。その結果、SQL Server はメモリ使用率に基づいてこれらのオブジェクトを拡大または縮小できます。キャッシュには、バッファプールとプラン キャッシュが含まれます。

固定メモリ

固定メモリは増減できます。縮小は、使用していない場合にのみ行われます。たとえば、接続の減少や、実行するクエリの数が減少した場合です。これはキャッシュとは異なります。固定メモリが十分でない場合、SQL Server のメモリが不足する可能性があります。固定メモリには、接続メモリとメモリ権限が含まれます。

SQL Server のオーバーヘッド

SQL Server のオーバーヘッドには、スレッドとスタックが含まれます。

インメモリ OLTP

インメモリ OLTP には、インメモリ テーブルとインメモリ ファイルグループが含まれます。

SQL Server によるメモリ消費量は、maximum server memorymemory.memory.limitmb を設定することで制御されます。memory.memory.limitmb パラメータは、Cloud SQL によって自動的に設定されます。

memory.memory.limitmb の詳細については、Microsoft のドキュメントをご覧ください。

max server memory の上限を適切な値に設定する必要があります。SQL Server では、max server memory が設定されていない場合、データベース ページはメモリの 100% 近くを消費する可能性があります。これは誤解を招きかねません。

メモリ最適化オプション

インスタンスのメモリ調整がさらに必要かどうかを判断するには、次の操作を行います。

  • max server memory の値を設定します。一般に、SQL Server が使用可能なメモリをすべて消費しないように、max server memory を約 80% に設定することをおすすめします。メモリ容量が大きいインスタンスの場合、80% では低すぎるため、メモリの浪費につながる可能性があります。

  • Page life expectancy をモニタリングする

    Page life expectancy は、最も古いページがバッファプールに保持される時間(秒単位)を示します。この値は Microsoft が推奨している 300 よりも大きくする必要があります。常に 300 を下回っている場合は、インスタンスのメモリ使用率が高くなっている可能性があります。次のクエリを実行して、Page life expectancy をモニタリングします。

    SELECT
      [object_name],
      [counter_name],
      [cntr_value]
    FROM
      sys.dm_os_performance_counters
    WHERE
      [object_name]
    LIKE
      '%Manager%'
    AND
      [counter_name] = 'Page life expectancy'
    
  • Memory Grants Pending をチェックする

    Memory Grants Pending には、ワークスペースのメモリの付与を待機しているプロセスの合計数を指定します。次のクエリを実行して Memory Grants Pending をチェックします。このクエリで保留中の権限が継続的に表示される場合は、メモリ使用率が高いことを示しています。データベースの待機をクエリし、メモリで待機しているステートメントを調整することで、待機時間を減らすことができます。

    SELECT
      @@SERVERNAME AS [Server Name],
      RTRIM([object_name]) AS [Object Name],
      cntr_value AS [Memory Grants Pending]
    FROM
      sys.dm_os_performance_counters WITH(NOLOCK)
    WHERE
      [object_name]
    LIKE
      N'%Memory Manager%'  -- Handles named instances
    AND
      counter_name = N'Memory Grants Pending'