次の方法で共有


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 データ ファイルの構成が次の表にまとめられている要件を満たしている場合にのみ有効です。

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

次のクエリでは、現在の 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 になります。

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

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

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

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

      たとえば、ボリュームに 100 GB の空き領域があり、2 つの tempdb データ ファイルがある場合は、各ファイルの MAXSIZE を 50 GB 以下にします。

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

動作方法

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

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

    リソース ガバナーが有効になっていて、ワークロード グループに対して tempdb 領域使用量の制限が設定されていて、ワークロード グループで実行されている要求 (クエリ) がグループによる合計 tempdb 領域消費を上限を超えようとすると、要求はエラー 1138、重大度 17、 データベース 'tempdb' の新しいページを割り当てませんでした。ワークロード グループ '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 列と group_max_tempdb_data_percent 列で公開されます。

    ワークロード グループによる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にユーザー ワークロードで使用できない未使用の領域が残っている場合は、エラー 1138 でクエリを中止できます。

  • すべてのワークロード グループの 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領域を割り当てることができます。