Microsoft SQL Serverのクラスター化インデックスと非クラスター化インデックスの違いは何ですか?
ニーズに合わせて適切な種類のインデックスを選択すると、データベースがより効率的に実行されます。
インデックスは、SQL Server が行からデータを迅速に取得するのに役立ちます。索引は本の冒頭の目次のように機能し、トピックが掲載されているページをすばやく検索できます。インデックスがないと、SQL Server はレコードを見つけるためにテーブル内のすべての行をスキャンする必要があります。
SQL Server には、クラスター化インデックスと非クラスター化インデックスの 2 種類のインデックスがあります。クラスター化インデックスと非クラスター化インデックスの違いと、それらが重要な理由を説明します。
SQL Server のクラスター化インデックス
クラスター化インデックスでは、データ行はキー値に基づいて順序付けられた方法で物理的に格納されます。インデックスにはテーブルが含まれており、行を 1 つの順序でしか配置できないため、テーブルごとにクラスタード インデックスを 1 つだけ作成できます。
インデックスを使用すると範囲内の行の取得が高速になりますが、クエリ オプティマイザーはターゲット インデックスが見つかるまでインデックスを順番にスキャンするため、INSERT ステートメントと UPDATE ステートメントは遅くなる可能性があります。
SQL Server の非クラスター化インデックス
非クラスター化インデックスには、行ロケーターと呼ばれるポインターをエントリとするキー値が含まれます。クラスター化テーブル (クラスター化インデックスを持つテーブル) の場合、ポインターはクラスター化インデックス内のキーを指し、そのキーがテーブル内の行を指します。クラスター化インデックスのない行の場合、ポインターはテーブルの行を直接指します。
SQL Server でクラスター化インデックスを作成する方法
主キーを含むテーブルを作成すると、SQL Server はその主キーに基づいてクラスター化インデックス キーを自動的に作成します。主キーがない場合は、次のステートメントを実行してクラスター化インデックス キーを作成できます。
CREATE CLUSTERED INDEX <index name>
ON TABLE <table_name>(column_name)
このステートメントでは、インデックスの名前、インデックスを作成するテーブルの名前、インデックスで使用する列の名前を指定します。
すでにクラスター化インデックスがあるテーブルに主キーを追加すると、SQL Server はそれを使用して非クラスター化インデックスを作成します。
主キー列を含まないクラスター化インデックスを作成するには、まず主キー制約を削除する必要があります。
USE database_name
ALTER TABLE table_name
DROP CONSTRAINT pk_name
GO
主キー制約を削除すると、クラスター化インデックスも削除され、カスタム インデックスを作成できるようになります。
SQL Server で非クラスター化インデックスを作成する方法
非クラスター化インデックスを作成するには、次のステートメントを使用します。
CREATE INDEX <index name>
ON TABLE <table_name>(column_name)
次のように NONCLUSTERED キーワードを使用することもできます。
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name)
このステートメントは、指定したテーブルに非クラスター化インデックスを作成し、指定した列を含めます。
必要に応じて、列を昇順 (ASC) または降順 (DESC) で並べ替えることができます。
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name ASC/DESC)
どのインデックスを選択する必要がありますか?
クラスター化インデックスと非クラスター化インデックスの両方により、クエリ時間が短縮されます。ほとんどのクエリがテーブル内の複数の列に対する SELECT 操作である場合、クラスター化インデックスの方が高速です。ただし、INSERT または UPDATE 操作の場合は、クエリ オプティマイザーがインデックスから直接列を見つけることができるため、非クラスター化インデックスの方が高速です。
ご覧のとおり、これらのインデックスはさまざまな SQL クエリに最適に機能します。したがって、ほとんどの SQL データベースでは、定期的に更新される列に対して少なくとも 1 つのクラスター化インデックスと非クラスター化インデックスを使用することでメリットが得られます。
SQL Server におけるインデックスの重要性
クラスター化インデックスと非クラスター化インデックスにより、クエリのパフォーマンスが向上します。クエリを実行すると、クエリ オプティマイザーは行の格納場所のインデックスをスキャンし、その場所から情報を取得します。これは、テーブル内のすべての行をスキャンするよりもはるかに高速です。
また、クエリがアクセスする列に非クラスター化インデックスを作成することで、ブックマーク検索のデッドロックを解決するために非クラスター化インデックスを使用することもできます。
