適用対象: 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 が設定されていません- すべてのデータ ファイルで、 MAXSIZE は UNLIMITED ではありません- すべてのデータ ファイルに対して、 FILEGROWTH は 0 ではありません |
tempdb データ ファイルは、最大サイズまで自動拡張できます |
すべてのデータ ファイルの MAXSIZE 値の合計 |
イエス |
-
GROUP_MAX_TEMPDB_DATA_MB が設定されていません- すべてのデータ ファイルに対して、 MAXSIZE は UNLIMITED- すべてのデータ ファイルに対して、 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をもう一度実行します。SIZE、FILEGROWTH、およびMAXSIZEの構成の詳細については、「ALTER DATABASEファイルとファイル グループのオプション」を参照してください。パーセント制限が有効で、データ ファイル
tempdb追加、削除、またはサイズ変更する場合は、ALTER RESOURCE GOVERNOR RECONFIGUREを実行して、リソース ガバナーを新しい最大サイズのtempdb(100%) で更新する必要があります。
注
新しいSQL Server インスタンスの場合、データ ファイルのMAXSIZEがUNLIMITEDされ、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_kbDMVで公開されます。ヒント
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内のすべての領域を消費することを防ぐことができます。 同時に、ワークロード グループtempdbと B が同時に大量の領域を消費する可能性が低いため、空き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の場合、MAXSIZEはUNLIMITED。 -
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;