SQL Server リソースを制御する

完了

一部の SQL Server または Azure SQL マネージド インスタンスは単一のアプリケーションのデータベース専用ですが、ミッション クリティカルなアプリケーションでよく見られる構成ですが、多くのサーバーでは、パフォーマンス要件が異なり、ワークロード サイクルがピーク時の複数のアプリケーションのデータベースがサポートされています。 これらの異なる要件の分散は、管理者にとって困難な場合があります。 サーバー リソースを管理する効果的な方法の 1 つは、SQL Server 2008 で導入されたリソース ガバナーを使用することです。

Resource Governor は、SQL Server および Azure SQL マネージド インスタンスの機能であり、受信アプリケーション要求の CPU、物理 I/O、メモリ リソースをきめ細かく制御できます。 インスタンス レベルで有効にすると、Resource Governor は分類子関数を使用して接続の処理方法を定義し、セッションをワークロード グループに分割します。 それぞれのワークロード グループを、特定のシステム リソース プールを使用するように構成することになります。

リソース プール

リソース プールは、サーバーで使用可能な物理リソースを表します。 SQL Server には常に、リソース ガバナーが有効になっていない場合でも、既定と内部の 2 つのプールがあります。 内部プールは重要な SQL Server 関数用に予約されており、制限することはできません。 既定のプールは、明示的に定義したリソース プールと共に、使用できるリソースに制限を設定して構成できます。 非インターナル プールごとに、次の制限を指定できます。

  • CPU の最小使用率と最大使用率
  • CPU 使用率の上限
  • メモリの最小使用率と最大使用率
  • NUMA ノード アフィニティ
  • ボリュームあたりの最小 IOPS と最大 IOPS

注意

リソース プールへの変更は新しいセッションにのみ影響し、進行中のセッションには影響しません。 そのため、プールを変更しても、実行時間の長いプロセスのリソースは制限されません。 この規則の例外は、SQL Server Machine Learning Services で使用される外部プールです。これは、進行中のセッションでもプールの変更によって制限される可能性があります。

CPU の最小および最大の割合を除くすべてのリソース プール設定は、超過できないハード制限を表します。 最小/最大 CPU 使用率は、CPU の競合がある場合にのみ適用されます。 たとえば、最大 70%を設定した場合、競合がない場合、ワークロードは使用可能な CPU サイクルの最大 100% を使用する可能性があります。 ただし、他のワークロードが実行されている場合、ワークロードは 70%に制限されます。

ワークロード グループ

ワークロード グループは、分類子関数によって分類されるセッション要求のコンテナーとして機能します。 リソース プールと同様に、既定と内部の 2 つの組み込みグループがあります。 各ワークロード グループは 1 つのリソース プールに関連付けられますが、リソース プールは複数のワークロード グループをホストできます。 既定では、分類子関数がユーザー定義グループに割り当てていない限り、すべての接続は既定のワークロード グループに送信されます。 既定のワークロード グループは、既定のリソース プールに割り当てられたリソースを利用します。

分類子関数

分類子関数は、個々の接続を特定のワークロード グループに分類するものです。SQL Server インスタンスとの接続が確立されたときに実行されます。 関数から NULL、既定値、または存在しないワークロード グループの名前が返された場合、セッションは既定のワークロード グループに転送されます。 分類子は接続ごとに実行されるため、その効率がテストされている必要があります。 次の図は、ユーザーをその名前に基づいて分類する分類子関数の例です。

CREATE FUNCTION dbo.RGClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @WorkloadGroup AS SYSNAME
IF(SUSER_NAME() = 'ReportUser')
    SET @WorkloadGroup = 'ReportServerGroup'

ELSE IF (SUSER_NAME() = 'PrimaryUser')
    SET @WorkloadGroup = 'PrimaryServerGroup'
ELSE
    SET @WorkloadGroup = 'default'

RETURN @WorkloadGroup
END

この例に示されている関数定義の複雑さを増やすことができますが、より複雑な関数がユーザーのパフォーマンスに影響しないことを確認する必要があります。

Resource Governor のユース ケース

Resource Governor は主に、データベースのグループが単一の SQL Server インスタンスを共有し、サーバーのすべてのユーザーに対してパフォーマンスの一貫性を保つ必要があるマルチテナント シナリオで使用されます。 整合性チェックやインデックスの再構築などのメンテナンス操作によって使用されるリソースを Resource Governor で制限することもできます。そうすれば、メンテナンス期間中でも、ユーザー クエリに必要なリソースを確保することができます。