Microsoft SQL Server のクラスター化インデックスと非クラスター化インデックスの違いは何ですか?

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 におけるインデックスの重要性

クラスター化インデックスと非クラスター化インデックスを使用すると、クエリのパフォーマンスが向上します。クエリを実行すると、クエリ オプティマイザーは行の格納場所のインデックスをスキャンし、その場所から情報を取得します。これは、テーブル内のすべての行をスキャンするよりもはるかに高速です。

また、非クラスター化インデックスを使用して、クエリがアクセスに関与する列の非クラスター化インデックスを作成することにより、ブックマーク ルックアップのデッドロックを解決することもできます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です