適用対象: 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 が設定されていませんすべてのデータファイルに対して、 MAXSIZE は UNLIMITED ではありません。- すべてのデータ ファイルに対して、 FILEGROWTH は 0 ではありません |
tempdb データ ファイルは、最大サイズまで自動拡張できます |
すべてのデータ ファイルの MAXSIZE 値の合計 |
イエス |
-
GROUP_MAX_TEMPDB_DATA_MB が設定されていません- すべてのデータ ファイルに対して、 MAXSIZE は UNLIMITED - すべてのデータ ファイルに対して、 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
の場合、MAXSIZE
はUNLIMITED
。 -
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
をもう一度実行します。
SIZE
、FILEGROWTH
、およびMAXSIZE
の構成の詳細については、「ALTER DATABASE ファイルとファイル グループのオプション」を参照してください。
注
SQL Server の新しいインスタンスの場合、データ ファイルの MAXSIZE
は UNLIMITED
され、 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
内のすべての領域を消費することを防ぐことができます。 同時に、ワークロード グループtempdb
と B が同時に大量の領域を消費する可能性が低いため、空きtempdb
領域がまだ使用可能な場合は、不要なクエリの中止を回避できます。同様に、すべてのワークロード グループの
GROUP_MAX_TEMPDB_DATA_PERCENT
値の合計が 100% を超える場合があります。 複数のグループが同時に高いtempdb
使用を引き起こす可能性が低いことがわかっている場合は、各グループにより多くのtempdb
領域を割り当てることができます。
関連コンテンツ
- チュートリアル: tempdb 領域リソース ガバナンスを構成する例
- リソース ガバナー
- チュートリアル: リソース ガバナーの構成例とベスト プラクティス
- リソースガバナーを変更する
- ワークロード グループを作成
- ALTER WORKLOAD GROUP の
- ワークロード グループ を削除する
- sys.resource_governor_workload_groups
- sys.dm_resource_governor_workload_groups