Tempdb 領域リソースのガバナンス

適用対象: SQL Server 2025 (17.x) 以降のバージョン

tempdbスペースリソースガバナンスを有効にすると、クエリやワークロードの暴走によってtempdb内の大量の領域が消費されるのを防ぐことができるため、信頼性が向上し、停止を回避できます。

SQL Server 2025 (17.x) 以降では、リソース ガバナーを使用して、ワークロード グループによって消費されるtempdb領域の合計量に制限を適用できます。 要求 (クエリ) が制限を超えようとすると、リソース ガバナーは、ワークロード グループの制限が適用されていることを示す個別のエラーで中止します。

実際には、異なるワークロード間で共有 tempdb 領域をパーティション分割できます。 たとえば、ミッション クリティカルなアプリケーションで使用されるワークロード グループの上限を高く設定し、他のすべてのワークロードで使用される default ワークロード グループの下限を設定できます。

詳細な構成例については、「 チュートリアル: tempdb 領域リソース ガバナンスを構成する例」を参照してください。

リソース ガバナーを使い始める

リソース ガバナーは、さまざまなアプリケーション、ユーザー、ユーザー グループなどに対して異なる tempdb 領域の制限を設定するための柔軟なフレームワークを提供します。カスタム ロジックに基づいて制限を設定することもできます。

SQL Serverでリソース ガバナーを初めて使用する場合は、リソース ガバナーの概念と機能について確認してください。

リソース ガバナー構成のチュートリアルとベスト プラクティスについては、「 チュートリアル: リソース ガバナーの構成例とベスト プラクティス」を参照してください。

tempdb 領域の使用量に制限を設定する

ワークロード グループによる tempdb 領域の使用量は、次の 2 つの方法のいずれかで制限できます。

  • 引数を使用してGROUP_MAX_TEMPDB_DATA_MBを設定します。

    ワークロード tempdb 使用要件が事前にわかっている場合、または tempdb サイズが変更されない場合は、固定制限を使用します。

  • 引数を使用してGROUP_MAX_TEMPDB_DATA_PERCENTを設定します。

    時間の経過に伴って tempdb の最大サイズを変更する可能性があり、ワークロード グループの構成を変更せずに各ワークロード グループで使用可能な tempdb 領域を比例的に変更する場合は、割合の制限を使用します。 たとえば、SQL Server を実行している Azure VM をスケールアップし、最大 tempdb サイズを増やすと、各ワークロード グループで使用可能な tempdb 領域も増加します。また、上限も引き上げます。

GROUP_MAX_TEMPDB_DATA_MB引数とGROUP_MAX_TEMPDB_DATA_PERCENT引数の詳細については、CREATE WORKLOAD GROUPまたはALTER WORKLOAD GROUPを参照してください。

同じワークロード グループに固定制限とパーセント制限の両方を指定すると、固定制限がパーセント制限よりも優先されます。

特定の SQL Server インスタンスでは、固定制限、パーセント制限、または tempdb 領域の使用量に制限のないワークロード グループを混在させることができます。 有効な制限を表示するには、「 ワークロード グループごとの有効な tempdb 領域の制限を表示する 」の例を参照してください。

パーセント制限の構成

ALTER RESOURCE GOVERNOR RECONFIGUREステートメントを実行すると、次の表に従ってパーセント制限が有効になります。

コンフィギュレーション 説明 Tempdb の最大サイズ (100%) %制限が実施中
- GROUP_MAX_TEMPDB_DATA_MB が設定されていません
- すべてのデータ ファイルで、MAXSIZEUNLIMITED ではありません
- すべてのデータ ファイルに対して、 FILEGROWTH は 0 ではありません
tempdb データ ファイルは、最大サイズまで自動拡張できます すべてのデータ ファイルの MAXSIZE 値の合計 イエス
- GROUP_MAX_TEMPDB_DATA_MB が設定されていません
- すべてのデータ ファイルに対して、 MAXSIZEUNLIMITED
- すべてのデータ ファイルに対して、 FILEGROWTH は 0 です
tempdb データ ファイルは意図したサイズに事前に作成されており、それ以上拡大することはできません すべてのデータ ファイルの SIZE 値の合計 イエス
その他のすべての構成 いいえ

tempdb構成を表示するには、tempdb データ ファイルの構成例を参照してください。

パーセント制限を使用する場合は、次の点を考慮してください。

  • GROUP_MAX_TEMPDB_DATA_PERCENT設定し、ALTER RESOURCE GOVERNOR RECONFIGURE ステートメントを実行しても、データ ファイルの構成が要件を満たしていない場合、ステートメントは正常に完了し、パーセント制限は格納されますが、適用されません。 この場合、警告メッセージ 10989、重大度 10 が表示され、エラー ログにも記録されます。

    GROUP_MAX_TEMPDB_DATA_PERCENT is not in effect because tempdb
    configuration requirements aren't met.
    
  • パーセント制限を有効にするには、要件を満たすように tempdb データ ファイルを再構成し、 ALTER RESOURCE GOVERNOR RECONFIGURE をもう一度実行します。 SIZEFILEGROWTH、およびMAXSIZEの構成の詳細については、「ALTER DATABASEファイルとファイル グループのオプション」を参照してください。

  • パーセント制限が有効で、データ ファイル tempdb 追加、削除、またはサイズ変更する場合は、 ALTER RESOURCE GOVERNOR RECONFIGURE を実行して、リソース ガバナーを新しい最大サイズの tempdb (100%) で更新する必要があります。

新しいSQL Server インスタンスの場合、データ ファイルのMAXSIZEUNLIMITEDされ、FILEGROWTHが 0 より大きくなります。これは、パーセント制限が有効でないことを意味します。 パーセント制限を使用するには、次のいずれかを行う必要があります。

  • データ ファイル tempdb 目的のサイズに事前拡張し、 FILEGROWTH を 0 に設定します。
  • 各データ ファイルの MAXSIZE を制限された値に設定します。
  • tempdbデータ ファイル ボリュームごとに、ボリューム上のファイルのMAXSIZE値の合計が、ボリューム上の使用可能なディスク領域以下であることを確認します。 たとえば、ボリュームに 100 GB の空き領域があり、2 つの tempdb データ ファイルがある場合は、各ファイルの MAXSIZE を 50 GB 以下にします。

動作方法

このセクションでは、 tempdb 空間リソースのガバナンスについて詳しく説明します。

  • tempdbのデータ ページが割り当てられ、割り当てが解除されると、リソース ガバナーは各ワークロード グループによって消費されるtempdb領域のアカウンティングを保持します。

    リソース ガバナーが有効になっており、ワークロード グループに対して tempdb 領域使用量の制限が設定されていて、ワークロード グループで実行されている要求 (クエリ) が、グループによる合計 tempdb 領域消費量を上限を超えようとすると、要求はエラー 1138 (重大度 17) で中止されます。

    Could not allocate a new page for database 'tempdb' because that
    would exceed the limit set for workload group 'workload-group-name'".
    

    エラー 1138 で要求が中止されると、sys.dm_resource_governor_workload_groups動的管理ビュー (DMV) のtotal_tempdb_data_limit_violation_count列の値が 1 ずつインクリメントされ、tempdb_data_workload_group_limit_reached拡張イベントが発生します。

  • リソース ガバナーは、一時テーブル、変数 (テーブル変数を含む)、テーブル値パラメーター、非一時テーブル、カーソル、クエリ処理中のtempdbの使用状況 (スプール、スピル、作業テーブル、ワークファイルなど) など、ワークロード グループに起因するすべてのtempdb使用状況を追跡します。

    tempdbのグローバル一時テーブルと非一時テーブルの領域消費量は、他のワークロード グループのセッションが同じテーブル内の行を追加、変更、または削除した場合でも、テーブルに最初の行を挿入するワークロード グループの下に考慮されます。

  • 各ワークロード グループに対して構成されたtempdb消費制限は、sys.resource_governor_workload_groups カタログ ビューの 列と group_max_tempdb_data_mb 列で公開されます。

    ワークロード グループによるtempdb領域の現在の消費量とピーク消費量は、それぞれおよびtempdb_data_space_kb列のpeak_tempdb_data_space_kb DMVで公開されます。

    ヒント

    tempdb_data_space_kbおよびsys.dm_resource_governor_workload_groupsのpeak_tempdb_data_space_kb列は、tempdb領域の消費に制限が設定されていない場合でも保持されます。

    最初に制限を設定することなく、分類子関数とワークロード グループを作成できます。 各グループの使用状況 tempdb 時間をかけて監視し、代表的な使用パターンを確立し、必要に応じて制限を設定します。

  • tempdb tempdb) が有効になっている場合の永続バージョン ストア (PVS) を含む、バージョン ストアによる使用は管理されません。これは、行バージョンが複数のワークロード グループの要求によって使用される可能性があるためです。

  • tempdbの領域使用量は、使用される 8 KB のデータ ページの数として考慮されます。 ページにデータが完全に格納されていない場合でも、ワークロード グループによる tempdb 使用量に 8 KB が追加されます。

  • tempdb 領域アカウンティングは、ワークロード グループの有効期間中維持されます。 このワークロード グループに対するデータを含むグローバル一時テーブルまたは非一時テーブルが tempdbに残っている間にワークロード グループが削除された場合、これらのテーブルで使用される領域は他のワークロード グループの下には考慮されません。

  • tempdb 領域リソース ガバナンスは、 tempdb データ ファイル内の領域を制御しますが、基になるボリュームのディスク領域は制御しません。 データ ファイル tempdb 目的のサイズに事前に拡張しない限り、 tempdb が配置されているボリューム上の領域が他のファイルによって消費される可能性があります。 tempdbデータ ファイルを拡張するための領域が残っていない場合、tempdbは、tempdb領域の消費に関するワークロード グループの制限に達する前に領域が不足する可能性があります。

  • tempdbの領域リソース ガバナンスはデータ ファイルに適用されますが、トランザクション ログ ファイルには適用されません。 tempdbのトランザクション ログで大量の領域が消費されないようにするには、tempdb を有効にします。

セッションレベルのスペーストラッキングとの違い

sys.dm_db_session_space_usage DMV は、セッションごとにtempdb領域の割り当てと割り当て解除の統計情報を提供します。 ワークロード グループにセッションが 1 つしかない場合でも、次の理由により、この DMV の領域使用量の統計情報が 、sys.dm_resource_governor_workload_groups ビューの統計情報と正確に一致しない可能性があります。

  • sys.dm_resource_governor_workload_groupsとは異なり、sys.dm_db_session_space_usage:
    • 現在実行中のタスクによる tempdb 領域の使用量は反映されません。 sys.dm_db_session_space_usageの統計は、タスクの完了時に更新されます。 sys.dm_resource_governor_workload_groupsの統計は継続的に更新されます。
    • インデックス割り当てマップ (IAM) ページを追跡しません。 詳細については、「 ページとエクステントのアーキテクチャ ガイド」を参照してください。
  • 行が削除された後、またはテーブル、インデックス、またはパーティションが削除または切り捨てられると、データベース エンジンはデータ ページの割り当てを解除します。 割り当て解除は、同期的に行われる場合もあれば、非同期のバックグラウンド プロセスによって行われる場合もあります。 sys.dm_resource_governor_workload_groups は、これらの割り当て解除の原因となったセッションが閉じられ、 sys.dm_db_session_space_usageに存在しなくなった場合でも、これらのページの割り当てが発生したときに反映されます。

tempdb 領域リソース ガバナンスのベスト プラクティス

tempdbスペース リソース ガバナンスを構成する前に、次のベスト プラクティスを検討してください。

  • リソース ガバナーの一般的な ベスト プラクティス を確認します。

  • ほとんどのシナリオでは、特に tempdb ワークロード グループでは、default領域の消費制限を小さい値またはゼロに設定しないでください。 この制限を小さい値またはゼロに設定すると、 tempdbに領域を割り当てる必要がある場合、多くの一般的なタスクが失敗し始める可能性があります。 たとえば、 default ワークロード グループの固定またはパーセントの制限を 0 に設定した場合、SQL Server Management Studio (SSMS) でオブジェクト エクスプローラーを開くことができません。

  • ワークロードを専用グループに配置するカスタム ワークロード グループと分類子関数を作成しない限り、tempdbワークロード グループのdefault使用を制限しないようにします。 tempdb ワークロード グループによるdefault領域の消費を制限すると、クエリでエラー 1138 が返される可能性があります。 このエラーは、 tempdb に、ユーザー ワークロードで使用できない未使用の領域が残っている場合に発生します。

  • すべてのワークロード グループの GROUP_MAX_TEMPDB_DATA_MB 値の合計が最大 tempdb サイズを超える可能性があります。 たとえば、最大tempdb サイズが 100 GB の場合、ワークロード グループ GROUP_MAX_TEMPDB_DATA_MB とワークロード グループ B制限はそれぞれ 80 GB になります。

    この方法では、他のワークロード グループに 20 GB を残すことで、各ワークロード グループが tempdb 内のすべての領域を消費することを防ぐことができます。 同時に、ワークロード グループ tempdbB が同時に大量の領域を消費する可能性が低いため、空きtempdb領域がまだ使用可能な場合は、不要なクエリの中止を回避できます。

    同様に、すべてのワークロード グループの GROUP_MAX_TEMPDB_DATA_PERCENT 値の合計が 100% を超える場合があります。 複数のグループが同時に高いtempdb使用を引き起こす可能性が低いことがわかっている場合は、各グループにより多くのtempdb領域を割り当てることができます。

tempdb データ ファイルの構成を表示する

次のクエリは、現在の tempdb データ ファイルの構成を示しています。

SELECT file_id,
       name,
       size * 8. / 1024 AS size_mb,
       IIF (max_size = -1, NULL, max_size * 8. / 1024) AS maxsize_mb,
       IIF (is_percent_growth = 0, growth * 8. / 1024, NULL) AS filegrowth_mb,
       IIF (is_percent_growth = 1, growth, NULL) AS filegrowth_percent
FROM sys.master_files
WHERE database_id = 2
      AND type_desc = 'ROWS';

結果セット内の特定のファイルの場合:

  • maxsize_mb列がNULLの場合、MAXSIZEUNLIMITED
  • filegrowth_mbまたはfilegrowth_percentが 0 の場合、FILEGROWTHは 0 になります。

ワークロード グループあたりの tempdb 領域の有効な制限を表示する

次のクエリは、各ワークロード グループの有効な tempdb 領域使用量の制限を示しています。 制限は、 固定制限 構成または パーセント制限 構成の場合、メガバイト単位で返されます。

group_effective_limit_mb列がNULLされている場合は、次のいずれかを意味します。

  • 固定制限もパーセント制限も構成されていない。
  • パーセント制限構成を使用するための 要件 が満たされていません。
SELECT wg.group_id,
       wg.name,
       tf.tempdb_max_size_mb,
       CASE
           WHEN wg.group_max_tempdb_data_mb IS NOT NULL
               THEN wg.group_max_tempdb_data_mb
           WHEN wg.group_max_tempdb_data_percent IS NOT NULL AND tf.tempdb_max_size_mb IS NOT NULL
               THEN 0.01 * wg.group_max_tempdb_data_percent * tf.tempdb_max_size_mb
       ELSE NULL END AS group_effective_limit_mb
FROM sys.resource_governor_workload_groups AS wg
CROSS APPLY (
    SELECT IIF (SUM(IIF (max_size <> -1
        AND growth > 0, 1, 0)) = COUNT(1) /* autogrow up to the maxsize */
        OR SUM(IIF (max_size = -1
        AND growth = 0, 1, 0)) = COUNT(1), /* pregrown and fixed */
        SUM(IIF (growth = 0, size, max_size)) * 8 / 1024., NULL) AS tempdb_max_size_mb
    FROM sys.master_files
    WHERE database_id = 2
        AND type_desc = 'ROWS'
) AS tf;

次のステップ