SQL Serverのインデックスの作成と管理:CREATE INDEX、DROP INDEX、インデックスの最適化

インデックスは、データベース内のデータを効率的に検索するための仕組みです。例えるなら、本の巻末にある索引のようなものです。インデックスがあることで、SQL Serverは必要なデータを迅速に見つけることができます。

データベースを効率的に運用するためには、インデックスの役割を理解し、それを適切に管理することが重要です。

本記事では、SQL Serverでのインデックスの基本概念から、具体的な作成方法(CREATE INDEX)、削除方法(DROP INDEX)、さらにはインデックスの最適化に至るまでを解説します。

この記事を読めば、SQL Serverで効率的なデータベース操作を行うための基礎知識を身につけることができます。


インデックスの作成

インデックスを作成するには、CREATE INDEX文を使用します。以下は基本的な構文です。

CREATE INDEXの基本構文

CREATE INDEX インデックス名
ON テーブル名 (列名);

使用例

例として、Employeesテーブルにインデックスを作成します。

CREATE INDEX idx_lastname
ON Employees (LastName);

このインデックスにより、LastName列での検索が高速化されます。

ユニークインデックスの作成

ユニークインデックスは、特定の列の値が一意であることを保証します。

CREATE UNIQUE INDEX idx_employee_id
ON Employees (EmployeeID);

複合インデックス

複数の列をまとめてインデックス化する方法です。

CREATE NONCLUSTERED INDEX idx_composite ON Orders(CustomerID, OrderDate);

インクルード列

一部の列を追加情報としてインデックスに含めることで性能を最適化します。

CREATE NONCLUSTERED INDEX idx_included ON Sales(OrderID) INCLUDE (ProductID, Quantity);

インデックスの削除

インデックスを削除するには、DROP INDEX文を使用します。削除したインデックスは元に戻せないため、注意が必要です。

DROP INDEXの基本構文

DROP INDEX テーブル名.インデックス名;

使用例

Employeesテーブルからidx_lastnameインデックスを削除する例です。

DROP INDEX Employees.idx_lastname;

インデックスの最適化

インデックスを正しく管理し、最適化することで、クエリの実行速度を向上させることができます。

適切な列にインデックスを作成

  • 頻繁に検索やソートに使用される列にインデックスを作成する。
  • 必要以上に多くのインデックスを作成しない。

フラグメンテーションの解消

インデックスの断片化を防ぐために、以下の操作を実施します:

再構築(Rebuild)
ALTER INDEX インデックス名 ON テーブル名 REBUILD;
再編成(Reorganize)
ALTER INDEX インデックス名 ON テーブル名 REORGANIZE;

クエリ実行計画の確認

SQL Server Management Studio(SSMS)を使用して、クエリ実行計画を確認します。

どのインデックスが使用されているかを把握し、不要なインデックスを削除できます。


演習問題

以下は本記事の内容を元にした演習問題です。

問題 1

以下のProductsテーブルに対して、CategoryID列にインデックスidx_category_idを作成するSQLを記述してください。

ProductIDProductNameCategoryID
1Apple1
2Banana1
3Carrot2

問題 2

作成したインデックスidx_category_idを削除するSQLを記述してください。


問題 3

次のシナリオを考えてください。OrdersテーブルのOrderDate列で頻繁に検索が行われています。この列に対してインデックスを作成してください。ただし、インデックス名をidx_order_dateとします。

OrderIDCustomerIDOrderDate
1C0012023-01-01
2C0022023-01-02
3C0032023-01-03

問題 4

断片化を解消するためにインデックスを再構築するSQLを記述してください。対象のインデックスはidx_order_dateです。


解答例

解答 1

CREATE INDEX idx_category_id
ON Products (CategoryID);

解答 2

DROP INDEX Products.idx_category_id;

解答 3

CREATE INDEX idx_order_date
ON Orders (OrderDate);

解答 4

ALTER INDEX idx_order_date ON Orders REBUILD;

まとめ

SQL Serverでのインデックス管理は、データベースのパフォーマンスを大きく左右する重要な要素です。

本記事で解説したインデックスの作成、削除、最適化を適切に実践することで、効率的なデータベース運用を実現できます。