パフォーマンスを向上させるためのヒント:SQL Serverでの主キーとクラスタ化インデックスの活用
SQL Server における主キーとクラスタ化インデックスの関係
主キー
主キーは、テーブル内の各行を一意に識別する列または列のグループです。主キーの値は常に一意でNULLであってはなりません。主キー制約を設定すると、データベースエンジンはその列に自動的にユニークインデックスを作成します。
主キーの主な利点は次のとおりです。
- データの一意性を保証します。
- 関連テーブル間の参照整合性を保ちます。
- データの検索と更新のパフォーマンスを向上させます。
クラスタ化インデックス
クラスタ化インデックスは、テーブルの行の物理的な順序を決定する特殊なインデックスです。テーブルにクラスタ化インデックスが設定されている場合、データベースエンジンはデータファイルをそのインデックス順に格納します。
クラスタ化インデックスの主な利点は次のとおりです。
- 結合操作のパフォーマンスを向上させることができます。
主キーとクラスタ化インデックスは密接に関連しています。デフォルトでは、SQL Server は主キー列にクラスタ化インデックスを作成します。ただし、必要に応じて、別の列にクラスタ化インデックスを作成することもできます。
クラスタ化インデックスを主キー列に必ず作成する必要があるわけではありません。しかし、主キーによる検索や範囲検索を頻繁に行う場合は、クラスタ化インデックスを作成することでパフォーマンスを大幅に向上させることができます。
以下の場合、主キー列にクラスタ化インデックスを作成することを検討する必要があります。
- 主キーによる検索または範囲検索を頻繁に行う。
- テーブルに結合操作を頻繁に行う。
- データの挿入と更新を頻繁に行う。
- 複数の列で構成される複合主キーを持つ。
主キーとクラスタ化インデックスは、どちらもデータベースのパフォーマンスを向上させる重要なツールです。それぞれの違いを理解し、適切な状況で使用することが重要です。
主キーとクラスタ化インデックスのサンプルコード
CREATE TABLE Customers (
CustomerID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
FirstName nvarchar(50) NOT NULL,
LastName nvarchar(50) NOT NULL,
Email nvarchar(100) NOT NULL UNIQUE
);
このコードは以下のことを行います。
Customers
という名前のテーブルを作成します。CustomerID
列を主キーとして定義します。CustomerID
列にクラスタ化インデックスを作成します。FirstName
、LastName
、Email
という名前の列を作成します。FirstName
列とLastName
列をNOT NULL
制約で制約します。Email
列をUNIQUE
制約で制約します。
この例では、CustomerID
列が主キーとクラスタ化インデックスの両方として使用されます。これは、この列がテーブル内の各行を一意に識別し、データ行の物理的な順序を決定するためです。
別の列にクラスタ化インデックスを作成するには、次の構文を使用できます。
CREATE CLUSTERED INDEX IX_Customers_LastName ON Customers (LastName);
このコードは、Customers
テーブルに IX_Customers_LastName
という名前のクラスタ化インデックスを作成します。このインデックスは、LastName
列の値に基づいてデータ行を順序付けします。
主キーとクラスタ化インデックスの詳細については、SQL Server のドキュメントを参照してください。
SQL Server で主キーとクラスタ化インデックスを作成するその他の方法
SQL Server Management Studio (SSMS) を使用する
SSMS は、SQL Server とやり取りするためのグラフィカル ツールです。SSMS を使用して主キーとクラスタ化インデックスを作成するには、次の手順を実行します。
- SSMS でデータベースに接続します。
- オブジェクト エクスプローラーで、主キーを作成するテーブルを右クリックします。
- コンテキスト メニューから [デザイン] を選択します。
- テーブル デザイナーが開きます。
- [インデックス/キー] タブを選択します。
- [追加] ボタンをクリックします。
- [インデックス キー列] ダイアログ ボックスで、クラスタ化インデックスに追加するテーブル列のチェック ボックスをオンにします。
- [OK] を選択します。
ALTER TABLE
ステートメントを使用して、既存のテーブルに主キーとクラスタ化インデックスを追加することもできます。構文は次のとおりです。
ALTER TABLE table_name
ADD PRIMARY KEY CLUSTERED (column_name1, column_name2, ...);
このコードは、table_name
という名前のテーブルに column_name1
、column_name2
などの列で構成される主キーとクラスタ化インデックスを追加します。
CREATE TABLE table_name (
column_name1 data_type PRIMARY KEY CLUSTERED,
column_name2 data_type,
...
);
使用する方法は、個々の状況によって異なります。 SSMS を使用すると、グラフィカル インターフェイスを使用して主キーとクラスタ化インデックスを簡単に作成できます。 ALTER TABLE
または CREATE TABLE
ステートメントを使用すると、より多くの制御と柔軟性を提供できます。
sql sql-server database