SQL Serverのインデックスとは?作成・名前変更・削除の方法を徹底解説
本記事では、SQL Serverにおけるインデックスの作成・名前変更・削除の方法について詳しく解説します。
SQL Serverのインデックスとは?
インデックス(索引)とは、テーブル内のレコードをより高速に検索・取得するための仕組みです。インデックスを作成すると、対象列に含まれる各値へのポインタが保持され、データベースエンジンはテーブル全体をスキャンすることなく目的の行へすばやくアクセスできるようになります。大量データを扱うシステムでは、適切なインデックス設計がクエリ性能を大きく左右します。
インデックスの作成(CREATE INDEX)
基本構文
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX インデックス名
ON テーブル名 ( 列1 [ ASC | DESC ], … 列n [ ASC | DESC ] )
[ INCLUDE ( 列1, … 列n ) ]
[ WHERE 条件 ]
[ WITH (
PAD_INDEX = { ON | OFF }
| FILLFACTOR = 充填率
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| STATISTICS_INCREMENTAL = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = 最大並列度
| DATA_COMPRESSION = { NONE | PAGE | ROW }
) ]
[ ON PARTITIONS ( { 番号 | 範囲 } ) ]
[ ON パーティション構成 ( 列 )
| ON ファイルグループ | ON 既定ファイルグループ ]
[ FILESTREAM_ON { ファイルグループ | パーティション構成 } ];
主な引数・オプションの説明
- UNIQUE:省略可能。インデックス列の値の組み合わせが一意(重複なし)であることを指定します。
- CLUSTERED:省略可能。クラスタ化インデックスを作成します。論理的な順序が、テーブル内の行の物理的な並び順を決定します。
- NONCLUSTERED:省略可能。非クラスタ化インデックスを作成します。論理的な順序は行の物理的な並び順には影響しません。
- インデックス名:作成するインデックスの名前です。
- テーブル名:インデックスを作成する対象のテーブルまたはビューの名前です。
- 列1, … 列n:インデックスの基となる列です。
- ASC | DESC:各列の値を昇順・降順のどちらでソートするかを指定します。
- INCLUDE (列1, … 列n):省略可能。キー列ではない列を、非クラスタ化インデックスのリーフレベルに追加します(カバリングインデックスの作成に有効です)。
- WHERE 条件:省略可能。フィルタされたインデックスとして、どの行をインデックスに含めるかを決定する条件を指定します。
- ON パーティション構成 (列):省略可能。パーティション構成(スキーム)を指定し、各パーティションがマップされるファイルグループを決定します。
- ON ファイルグループ:省略可能。指定したファイルグループ上にインデックスを作成します。
- ON 既定ファイルグループ:省略可能。既定のファイルグループ上にインデックスを作成します。
- FILESTREAM_ON {ファイルグループ | パーティション構成}:省略可能。クラスタ化インデックスにおけるFILESTREAMデータの格納場所を指定します。
インデックス作成の例
CREATE INDEX meibo_index
ON meibo (myoji);
この例では、「meibo」テーブルに対して「meibo_index」という名前のインデックスを作成しています。対象となるのは「myoji(姓)」という1つの列です。複数の列を組み合わせた複合インデックスも、次のように作成できます。
CREATE INDEX meibo_index
ON meibo (myoji, namae);
この例では、「myoji」と「namae」の2つの列を含むインデックスを作成しています。各列にASCまたはDESCを指定しない場合、既定ではすべての列が昇順(ASC)でソートされます。降順にしたい場合は、次のように記述します。
CREATE INDEX meibo_index
ON meibo (myoji DESC, namae DESC);
このCREATE INDEX文により、姓と名の両方が降順にソートされたインデックスが作成されます。
一意インデックスの作成例
CREATE UNIQUE INDEX meibo_unique_index
ON meibo (myoji, namae);
この例では、姓と名の2つの列を含む一意インデックスを作成しており、これら2つの列の値の組み合わせが重複しないことが保証されます。
さらに、クラスタ化された一意インデックスを作成することも可能です。その場合、テーブル内の行の物理的な並び順が、インデックスの論理的な順序に従って決まります。
CREATE UNIQUE CLUSTERED INDEX meibo_unique_index
ON meibo (myoji, namae);
この例で作成されるインデックスは、姓と名の2列から構成されるとともに、テーブル内の行の並び順自体もこのインデックスに従って並べ替えられます。
インデックスの名前を変更する(sp_rename)
構文
sp_rename 'テーブル名.現在のインデックス名', '新しいインデックス名', 'INDEX';
- テーブル名:インデックスが作成されているテーブルの名前。
- 現在のインデックス名:名前を変更したいインデックスの現在の名前。
- 新しいインデックス名:インデックスに付けたい新しい名前。
例
sp_rename 'meibo.meibo_index', 'meibo_index_namae', 'INDEX';
この例では、「meibo」テーブルのインデックス名を「meibo_index」から「meibo_index_namae」に変更しています。
インデックスを削除する(DROP INDEX)
構文
DROP INDEX テーブル名.インデックス名;
- テーブル名:インデックスが作成されているテーブルの名前。
- インデックス名:削除するインデックスの名前。
例
DROP INDEX meibo.meibo_index;
この例では、「meibo_index」という名前のインデックスを削除しています。
まとめ
インデックスはクエリの検索速度を大幅に向上させる一方で、データ更新時のオーバーヘッド増加やストレージ消費といったトレードオフも伴います。読み取りが多いテーブルには積極的にインデックスを活用し、頻繁に更新される列への適用は慎重に行うなど、運用状況に応じた適切な設計を心がけましょう。
-
【SQL Server入門】ストアドプロシージャの作成と削除方法を徹底解説
プロシージャ(Procedure)とは、データベース内に保存しておき、後から再利用できる複数のステートメントで構成されたプログラムのことです。SQL Serverでは、プロシージャにパラメータを渡すことが可能です。関数のように特定の値を返すわけではありませんが、実行の成功・失敗を示す役割を持ちます。 本記事では、SQL Serverにおけるプロシージャの作成方法と削除方法について、基本構文と具体例を交えながらわかりやすく解説します。 CREATE PROCEDURE(プロシージャの作成) 構文 SQL Serverでプロシージャを作成するには、以下の構文を使用します。 CREATE {
-
MS SQL Serverとは?特徴・主な用途・バージョン履歴・インスタンスの基インスタンスの基礎を徹底解説
SQL Server(MS SQL Server)とは? SQL Serverは、Microsoftが開発したリレーショナルデータベース管理システム(RDBMS)です。従来のRDBMSの枠組みにとどまらず、オブジェクト指向の概念も取り入れたORDBMS(オブジェクトリレーショナルデータベース管理システム)としての側面も併せ持っています。主な特徴は以下の通りです。 Microsoftが開発したRDBMSベースのデータベースソフトウェアである ORDBMS(オブジェクトリレーショナルデータベース管理システム)としても機能する 特定のプラットフォームに依存しない独立した環境で動作する コマンドライ