クラスター化インデックスの作成

SQL Server 2012 で SQL Server Management Studio または Transact-SQL を使用して、テーブルにクラスター化インデックスを作成できます。 クラスター化インデックスは、いくつかの例外を除くすべてのテーブルに必要です。 クラスター化インデックスは、クエリ パフォーマンスを向上するだけではなく、必要に応じて再構築または再構成してテーブルの断片化を制御することができます。 また、クラスター化インデックスをビューに作成することもできます。 クラスター化インデックスの定義については、「クラスター化インデックスと非クラスター化インデックスの概念」を参照してください。

このトピックの内容

  • 作業を開始する準備:

    一般的な実装

    制限事項と制約事項

    セキュリティ

  • テーブルにクラスター化インデックスを作成するために使用するもの:

    SQL Server Management Studio

    Transact-SQL

作業を開始する準備

一般的な実装

クラスター化インデックスは、次のように実装されます。

  • PRIMARY KEY 制約と UNIQUE 制約

    PRIMARY KEY 制約を作成すると、テーブルにクラスター化インデックスが存在せず、一意な非クラスター化インデックスを指定しなかった場合、列に一意なクラスター化インデックスが自動的に作成されます。 主キー列には NULL 値を指定できません。

    UNIQUE 制約を作成すると、既定では、一意な非クラスター化インデックスが作成され、UNIQUE 制約が適用されます。 テーブルにクラスター化インデックスが存在しない場合は、一意なクラスター化インデックスを指定できます。

    制約の一部として作成されたインデックスには、自動的に制約名と同じ名前が指定されます。 詳細については、「主キー制約と外部キー制約」および「UNIQUE 制約と CHECK 制約」を参照してください。

  • 制約に依存しないインデックス

    非クラスター化主キー制約が指定された場合、主キー列以外の列にクラスター化インデックスを作成できます。

制限事項と制約事項

  • クラスター化インデックスの構造を作成する場合、古い (作成元の) 構造と新しい (作成先の) 構造の両方を格納するディスク領域が、それぞれのファイルとファイル グループで必要になります。 古い構造の割り当ては、トランザクション全体がコミットされるまで解除されません。 並べ替え操作用に、余分な一時ディスク領域が必要になる場合もあります。 詳細については、「インデックス DDL 操作に必要なディスク領域」を参照してください。

  • 複数の非クラスター化インデックスが存在するヒープにクラスター化インデックスを作成する場合、すべての非クラスター化インデックスを再構築して、行識別子 (RID) の代わりにクラスター化キー値が含まれるようにする必要があります。 同様に、複数の非クラスター化インデックスを持つテーブルのクラスター化インデックスを削除すると、DROP 操作の一部として非クラスター化インデックスがすべて再構築されます。 大きなテーブルでは、この操作に相当な時間がかかる場合があります。

    大きなテーブルにインデックスを構築する場合、最初にクラスター化インデックスを構築してから、非クラスター化インデックスを構築することをお勧めします。 既存のテーブルにインデックスを作成するときは、ONLINE オプションを ON に設定することを検討します。 ON に設定すると、テーブル ロックは長時間保持されません。 これにより、基になるテーブルに対するクエリまたは更新を続行できます。 詳細については、「オンラインでのインデックス操作の実行」を参照してください。

  • クラスター化インデックスのインデックス キーには、ROW_OVERFLOW_DATA アロケーション ユニットに既存のデータを持つ varchar 列を含めることはできません。 クラスター化インデックスが varchar 型の列に作成され、その列の既存データが IN_ROW_DATA アロケーション ユニットにある場合、それ以後、既存データを行外に押し出すことになるような挿入や更新操作は失敗します。 行オーバーフロー データを含んでいる可能性のあるテーブルに関する情報を取得するには、sys.dm_db_index_physical_stats (Transact-SQL) 動的管理関数を使用します。

セキュリティ

権限

テーブルまたはビューに対する ALTER 権限が必要です。 実行するには、固定サーバー ロール sysadmin または、固定データベース ロール db_ddladmin および db_owner のメンバーである必要があります。

[トップに戻る] リンクで使用される矢印アイコン[Top]

SQL Server Management Studio の使用

オブジェクト エクスプ ローラーを使用してクラスター化インデックスを作成するには

  1. オブジェクト エクスプローラーで、クラスター化インデックスを作成するテーブルを展開します。

  2. [インデックス] フォルダーを右クリックし、[新しいインデックス] をポイントし、[クラスター化インデックス] を選択します。

  3. [新しいインデックス] ダイアログ ボックスの [全般] ページで、[インデックス名] ボックスに新しいインデックスの名前を入力します。

  4. [インデックス キー列] で、[追加] をクリックします。

  5. [table_name から列を選択] ダイアログ ボックスで、クラスター化インデックスに追加するテーブル列のチェック ボックスをオンにします。

  6. [OK] をクリックします。

  7. [新しいインデックス] ダイアログ ボックスで、[OK] をクリックします。

テーブル デザイナーを使用してクラスター化インデックスを作成するには

  1. オブジェクト エクスプローラーで、クラスター化インデックスを含むテーブルを作成するデータベースを展開します。

  2. [テーブル] フォルダーを右クリックし、[新しいテーブル] をクリックします。

  3. 通常どおりに新しいテーブルを作成します。 詳細については、「テーブルの作成 (データベース エンジン)」を参照してください。

  4. 上の手順で作成した新しいテーブルを右クリックし、[デザイン] をクリックします。

  5. [テーブル デザイナー] メニューの [インデックス/キー] をクリックします。

  6. [インデックス/キー] ダイアログ ボックスで、[追加] をクリックします。

  7. [選択された主/一意キーまたはインデックス] ボックスで、新しいインデックスを選択します。

  8. グリッドで、[CLUSTERED として作成] を選択し、プロパティ右のドロップダウン リストの [はい] を選択します。

  9. [閉じる] をクリックします。

  10. [ファイル] メニューの [table_name の保存] をクリックします。

[トップに戻る] リンクで使用される矢印アイコン[Top]

Transact-SQL の使用

クラスター化インデックスを作成するには

  1. オブジェクト エクスプローラーで、データベース エンジンのインスタンスに接続します。

  2. [標準] ツール バーの [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。

    USE AdventureWorks2012;
    GO
    -- Create a new table with three columns.
    CREATE TABLE dbo.TestTable
        (TestCol1 int NOT NULL,
         TestCol2 nchar(10) NULL,
         TestCol3 nvarchar(50) NULL);
    GO
    -- Create a clustered index called IX_TestTable_TestCol1
    -- on the dbo.TestTable table using the TestCol1 column.
    CREATE CLUSTERED INDEX IX_TestTable_TestCol1 
        ON dbo.TestTable (TestCol1); 
    GO
    

詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。

[トップに戻る] リンクで使用される矢印アイコン[Top]

関連項目

概念

主キーの作成

UNIQUE 制約の作成