インデックスを調整および管理する

完了

T-SQL のクエリをチューニングする最も一般的な (そして最も効果的な) 方法は、インデックス付けの方法を評価して調整することです。 データベースに適切にインデックスが付けられていると、クエリ結果を返すために実行される IO が少なくなります。IO が少ないと、IO システムとストレージ システムの両方で負荷が軽減されます。 IO を減らすと、メモリの使用率を高めることもできます。 クエリの読み取りと書き込みの比率に注意してください。

書き込みワークロードが多いことは、コストをかけて追加のインデックスに行を書き込んでも、あまりメリットにならないことを示す場合があります。 例外は、参照操作を行う必要もある更新が主に実行されるワークロードの場合です。 参照が行われる更新操作の場合は、インデックスを追加したり、既存のインデックスに列を追加したりすると、メリットがある可能性があります。 テーブルのインデックスの数を最小限に抑えて、最大限のメリットが得られるようにすることを、常に目標にする必要があります。

一般的なパフォーマンス チューニングの方法は次のとおりです。

  • sys.dm_db_index_operational_statssys.dm_db_index_usage_stats を使用して、既存のインデックスの使用状況を評価します。

  • 使用されていないインデックスと重複するインデックスの削除を検討します。ただし、これは慎重に行う必要があります。 インデックスの中には、月、四半期、または年に一度の操作の間にのみ使用され、それらのプロセスにとって重要であるものが存在する場合があります。 また、そのような場合以外には使用されないインデックスをテーブルに保持するオーバーヘッドを減らすため、そのような操作がスケジュールされる直前に、操作をサポートするインデックスを作成することを検討することもできます。

  • クエリ ストアまたは拡張イベント キャプチャから高コストのクエリを調べて評価し、それらのクエリをより適切に処理できるように手動でインデックスを構築します。

  • 非運用環境でインデックスを作成し、クエリの実行とパフォーマンスをテストして、パフォーマンスの変化を観察します。 メモリの量と CPU の数が実行プランに影響する可能性があるため、運用環境と非運用環境のハードウェアの違いに注意することが重要です。

  • 慎重にテストした後、運用システムに変更を実装します。

インデックスの列の順序を確認します。先頭の列によって列の統計が左右され、通常は、オプティマイザーでそのインデックスが選択されるかどうかが決まります。 先頭の列として理想的なのは、選択的であり、多くのクエリの WHERE 句で使用されるものです。 アプリケーションのパフォーマンスに影響する可能性がある変更を追跡するには、変更制御プロセスを使用することを検討します。 インデックスを削除する前に、ソース管理にコードを保存しておき、実行頻度の低いクエリでパフォーマンス向上のためにインデックスが必要になったときに、そのインデックスをすばやく再作成できるようにします。

最後に、等値比較に使用する列は不等値比較に使用される列の前に置く必要があり、選択度の高い列は個別の値が少ない列の前に置く必要があります。

再開可能なインデックス

再開可能なインデックスを使用すると、インデックスのメンテナンス操作を一時停止したり、時間枠内で実行したり、後で再開したりすることができます。 再開可能なインデックス操作を使用するのに適した例は、ビジーな運用環境でインデックス メンテナンスの影響を軽減する場合です。 そうすることで、プロセスをより細かく制御して、特定のメンテナンス期間中に再構築操作を実行することができます。

さらに、大きなテーブルのインデックスを作成すると、データベース システム全体のパフォーマンスに悪影響を及ぼす可能性があります。 SQL Server 2019 より前のバージョンでこの問題を解決する唯一の方法は、インデックス作成プロセスを中止することです。 その場合、システムがセッションをロールバックするのであれば、最初からプロセスを開始する必要があります。

再開可能なインデックスを使用すると、ビルドを一時停止しても、その一時停止したポイントから後ほど再開できます。

次の例では、再開可能なインデックスを作成する方法を示します。

-- Creates a nonclustered index for the Customer table

CREATE INDEX IX_Customer_PersonID_ModifiedDate 
    ON Sales.Customer (PersonID, StoreID, TerritoryID, AccountNumber, ModifiedDate)
WITH (RESUMABLE=ON, ONLINE=ON)
GO

クエリ ウィンドウで、インデックス操作を一時停止します。

ALTER INDEX IX_Customer_PersonID_ModifiedDate ON Sales.Customer PAUSE
GO

上のステートメントでは、PAUSE 句を使用して、再開可能なオンライン インデックスの作成を一時的に停止します。

再開可能なオンライン インデックスの現在の実行状態は、sys.index_resumable_operations システム ビューに対してクエリを実行することで確認できます。

Note

再開可能なインデックスは、オンライン操作でのみサポートされます。