SQL Serverのカバリングインデックス:効率的なクエリを実現する仕組みと活用法

データベースのパフォーマンスを最適化するためには、適切なインデックスの設計が重要です。その中でも「カバリングインデックス(Covering Index)」は、特定のクエリを高速化する強力なツールです。

本記事では、SQL Serverにおけるカバリングインデックスの基本概念、メリット、活用例、注意点を詳しく解説します。さらに、演習問題を通じて理解を深める機会を提供します。


カバリングインデックスとは?

カバリングインデックスとは、クエリが必要とするすべての列をインデックスに含めることにより、クエリのパフォーマンスを向上させるインデックスの一種です。

このインデックスにより、データベースはテーブルの主データ(クラスタ化インデックスやヒープ)にアクセスせず、インデックスだけでクエリを完結させることができます。

たとえば、次のクエリを考えます。

SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE CustomerID = 'ALFKI';

このクエリで必要なのは、OrderIDCustomerID、およびOrderDateです。これらの列をカバリングインデックスに含めることで、データの取得を高速化できます。


カバリングインデックスのメリット

  1. クエリの高速化
    必要なデータがインデックスに含まれているため、ディスクI/Oを削減し、クエリの実行速度が向上します。
  2. キー・ルックアップの回避
    通常の非クラスタ化インデックスでは、インデックスに存在しない列を取得する際に「キー・ルックアップ」が発生しますが、カバリングインデックスではこれを回避できます。
  3. 読み取り負荷の軽減
    テーブル全体へのアクセスを避けることで、データベースのパフォーマンスを全体的に改善します。

カバリングインデックスの作成例

次に、SQL Serverでカバリングインデックスを作成する方法を見ていきます。

1. テーブルの準備

以下のようなテーブルを用意します。

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID NVARCHAR(5),
    OrderDate DATE,
    TotalAmount DECIMAL(10, 2)
);

2. カバリングインデックスの作成

上記のクエリを高速化するため、カバリングインデックスを作成します。

CREATE NONCLUSTERED INDEX IDX_Covering_Orders
ON Orders (CustomerID)
INCLUDE (OrderID, OrderDate);

このインデックスでは、CustomerIDをキー列として、OrderIDOrderDateを含めています。


カバリングインデックスの注意点

  1. インデックスのサイズ増加
    多くの列をインデックスに含めると、ストレージを圧迫する可能性があります。
  2. 更新クエリのパフォーマンス低下
    INSERT、UPDATE、DELETE操作の負荷が増加するため、頻繁に更新されるテーブルには慎重に適用する必要があります。
  3. 適切な列の選択
    必要以上の列を含めると逆効果になるため、クエリの要件に基づいて列を選択することが重要です。

カバリングインデックスの演習問題

以下の演習問題に取り組み、カバリングインデックスの理解を深めてください。

問題 1

次のようなテーブルを用意してください。

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName NVARCHAR(50),
    Category NVARCHAR(20),
    Price DECIMAL(10, 2),
    Stock INT
);

以下のクエリを最適化するためのカバリングインデックスを作成してください。

SELECT ProductName, Price
FROM Products
WHERE Category = 'Electronics';

問題 2

カバリングインデックスを作成した場合と作成しなかった場合で、クエリの実行計画を比較し、どのような違いがあるか説明してください。


解答例

解答例 1

カバリングインデックスは次のように作成できます。

CREATE NONCLUSTERED INDEX IDX_Covering_Products
ON Products (Category)
INCLUDE (ProductName, Price);

このインデックスは、Categoryをキー列とし、ProductNamePriceを含めています。

解答例 2

カバリングインデックスを作成した場合、クエリの実行計画には「キー・ルックアップ」が表示されません。

一方、インデックスを作成しない場合は、テーブル全体をスキャンする「Clustered Index Scan」や「Table Scan」が実行計画に含まれます。

これにより、カバリングインデックスがクエリのパフォーマンスを大幅に向上させることが分かります。


まとめ

カバリングインデックスは、SQL Serverでクエリのパフォーマンスを改善するための強力な手段です。ただし、適切に設計しないとストレージの無駄遣いや更新のパフォーマンス低下を引き起こす可能性があるため、クエリ要件に基づいて慎重に選択してください。

この記事を参考に、実際にカバリングインデックスを試してみてください!