SQL Serverのインデックスの基本:クラスタードインデックスと非クラスタードインデックスの違い

インデックスはデータベースのパフォーマンスを向上させるために非常に重要な役割を果たします。

この記事では、SQL Serverのインデックスの基本と、特に「クラスタードインデックス」と「非クラスタードインデックス」の違いについて解説します。

これらを理解することで、効率的なデータベース設計とクエリの高速化に役立てることができます。


インデックスとは何か?

インデックスは本の索引のようなものです。データベース内の特定の列にインデックスを作成することで、データをより迅速に検索できます。

インデックスがない場合、SQL Serverはデータをテーブル全体から順番に探す必要があります(これを「テーブルスキャン」と呼びます)。

インデックスを利用すれば、このスキャンを最小限に抑えることができます。


クラスタードインデックスとは

クラスタードインデックスは、テーブル内のデータ行そのものを並べ替えるインデックスです。各テーブルに1つしか作成できません。

特徴

物理的な並び替え

クラスタードインデックスを作成すると、データ行はそのインデックス列に基づいて物理的に並び替えられます。

主キーに自動的に作成される

SQL Serverでは、主キーを設定すると、自動的にクラスタードインデックスが作成されます(ただし、明示的に変更可能)。

CREATE CLUSTERED INDEX idx_order_date  
ON Orders (OrderDate);

この例では、OrdersテーブルのOrderDate列に基づいてデータが並べ替えられます。


非クラスタードインデックスとは

非クラスタードインデックスは、データ行そのものではなく、データ行の参照情報を保持するインデックスです。1つのテーブルに複数の非クラスタードインデックスを作成することができます。

特徴

データの並び順に影響を与えない

非クラスタードインデックスは、テーブル内のデータそのものを並べ替えることはありません。

検索のためのポインタを含む

非クラスタードインデックスには、指定された列の値と、そのデータ行の物理的な場所を指すポインタが含まれます。

CREATE NONCLUSTERED INDEX idx_customer_name  
ON Customers (CustomerName);

この例では、CustomersテーブルのCustomerName列に非クラスタードインデックスが作成されます。


クラスタードインデックスと非クラスタードインデックスの違い

以下の表に、クラスタードインデックスと非クラスタードインデックスの違いをまとめます。

特徴クラスタードインデックス非クラスタードインデックス
データの並び替え並び替えられる並び替えられない
テーブルごとの制限1つのみ複数作成可能
データ格納場所データ行そのものポインタを使用してデータを参照
主な用途主キーや一意の値に基づいた検索フィルタリングや特定列の検索を高速化する目的

インデックスのメリットとデメリット

メリット

  1. 検索速度の向上
    適切なインデックスを使用することで、クエリの実行時間を大幅に短縮できます。
  2. ソート処理の最適化
    インデックスを使用すると、データのソートが効率的になります。

デメリット

  1. 挿入・更新のコスト増
    インデックスを更新する必要があるため、データの挿入や更新が遅くなる場合があります。
  2. ストレージの消費
    インデックスを作成すると、その分ストレージ容量を消費します。

適切なインデックスの選択基準

インデックスを効果的に利用するためには、以下のポイントを考慮する必要があります。

1. 主キーと一意性制約

主キーには自動的にクラスター化インデックスが作成されます。一意性を保つ必要がある列にはインデックスを設定するのが一般的です。

2. 頻繁に使用するクエリを分析

  • WHERE句に頻繁に使用される列。
  • JOIN句ORDER BY句で使用される列。

3. カーディナリティ(値の多様性)の高い列

重複する値が少ない列にインデックスを設定すると効果的です(例:社員番号など)。

4. クエリパフォーマンスをモニタリング

SQL Server Management Studio (SSMS)の実行プランを使用して、インデックスがどのように活用されているかを確認します。


インデックスに関連するベストプラクティス

必要以上にインデックスを作成しない

インデックスが多すぎると更新処理に負荷がかかるため、必要最低限に抑えましょう。

カバリングインデックスを活用

クエリが必要とするすべての列を含むインデックスを作成すると、テーブルアクセスを回避できます。

断片化の監視と再構築

インデックスが断片化すると性能が低下します。定期的に再構築することを推奨します。

ALTER INDEX idx_nonclustered ON Employees REBUILD;
フィルタ付きインデックス

条件を限定したインデックスで効率化します。

CREATE NONCLUSTERED INDEX idx_filtered ON Orders(OrderStatus) WHERE OrderStatus = 'Completed';

演習問題

以下の問題を解いて、クラスタードインデックスと非クラスタードインデックスについて理解を深めましょう。

問題1: クラスタードインデックスの作成

次のProductsテーブルにおいて、ProductID列を基準にクラスタードインデックスを作成するSQL文を記述してください。

問題2: 非クラスタードインデックスの作成

次のEmployeesテーブルにおいて、LastName列を基準に非クラスタードインデックスを作成するSQL文を記述してください。

問題3: インデックスのメリットとデメリット

クラスタードインデックスと非クラスタードインデックスの違いに基づき、以下の設問に答えてください。

  • (a) データの検索速度を優先する場合、どちらのインデックスが適切ですか?
  • (b) 挿入操作が頻繁に行われる場合、どちらのインデックスの使用を避けるべきですか?

解答例

問題1: クラスタードインデックスの作成

CREATE CLUSTERED INDEX idx_product_id  
ON Products (ProductID);

問題2: 非クラスタードインデックスの作成

CREATE NONCLUSTERED INDEX idx_last_name  
ON Employees (LastName);

問題3: インデックスのメリットとデメリット

  • (a) データの検索速度を優先する場合:クラスタードインデックスが適切です。物理的な並び替えにより検索が高速になります。
  • (b) 挿入操作が頻繁に行われる場合:クラスタードインデックスの使用を避けるべきです。並び替えのオーバーヘッドが発生するためです。

まとめ

SQL Serverにおけるクラスタードインデックスと非クラスタードインデックスの違いを理解することで、データベースのパフォーマンスを最適化できます。それぞれの特性を活かし、適切なインデックス設計を行いましょう。

インデックスを適切に利用すれば、システム全体の効率を大幅に向上させることが可能です。しかし、データの更新頻度やストレージのコストを考慮することも重要です。

この記事を参考に、実際のデータベースでインデックスの利用を試してみてください!