付加列インデックスの作成

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

このトピックでは、SQL Server Management Studio または Transact-SQLを使用し、付加列 (非キー列) を追加して、SQL Server の非クラスター化インデックスの機能を拡張する方法について説明します。 非キー列を含めることにより、より多くのクエリをカバーする非クラスター化インデックスを作成できます。 これは、非キー列には次の利点があるためです。

  • 非キー列には、インデックス キー列として許可されていないデータ型を設定できる。
  • インデックス キー列の数やインデックス キーのサイズを計算するとき、データベース エンジンでは、これらが考慮されません。

クエリ内のすべての列が、キー列または非キー列としてインデックスに含まれるているとき、非キー列を含むインデックスにより、クエリ パフォーマンスが大幅に向上します。 クエリ オプティマイザーではインデックス内のすべての列値を参照できるので、テーブルやクラスター化インデックスのデータにアクセスすることがなく、ディスク I/O 操作が少なくて済むため、パフォーマンスが向上します。

注意

クエリによって参照されるすべての列がインデックスに含まれているときは、一般的に、そのインデックスは クエリをカバーしていると呼ばれます。

始める前に

設計上の推奨事項

  • 検索や参照に使用される列のみがキー列になるように、大きなサイズのインデックス キーが含まれる非クラスター化インデックスを設計し直します。 クエリをカバーする他のすべての列を非キー列にします。 その結果、クエリをカバーするために必要なすべての列を含むことができますが、インデックス キー自体は小さく、効率的です。

  • 非クラスター化インデックスに非キー列を含め、現在のインデックス サイズの制限で (最大 32 個のキー列と、最大 1,700 バイトのインデックス キー サイズ) を超えないようにします ( SQL Server 2016 (13.x)より前は、最大 16 個のキー列と最大 900 バイトのインデックス キーのサイズでした)。 インデックス キー列の数やインデックス キーのサイズを計算するときに、 データベース エンジンでは非キー列が考慮されません。

  • インデックス定義内の非キー列の順序は、インデックスを使用するクエリのパフォーマンスには影響しません。

  • 付加列によって、基になるテーブル列の十分に狭いサブセットが表されていない場合は、非常に広い非クラスター化インデックスは避けてください。 広いインデックスを追加する場合は、1 つの余分な広いインデックスを更新するコストによって、テーブルから直接読み取るコストが埋め合わされるかどうかを常に確認してください。

制限事項と制約事項

  • 非キー列を定義できるのは、クラスター化されていないインデックスだけです。

  • textntextimage を除くすべてのデータ型は、非キー列として使用できます。

  • 決定的な計算列は、正確かどうかに関係なく、非キー列にすることができます。 詳細については、「 計算列のインデックス」を参照してください。

  • 計算列が imagentexttext の各データ型から派生している場合は、計算列のデータ型が非キー インデックス列として許可されている限り、非キー列にできます。

  • インデックスを先に削除しない限り、非キー列をテーブルから削除できません。

  • 次の操作以外に、非キー列は変更できません。

    • 列の NULL 値の許容を NOT NULL から NULL に変更する。

    • varcharnvarchar、または varbinary の各列の長さを拡張します。

セキュリティ

アクセス許可

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

SQL Server Management Studio を使用する

非キー列を含むインデックスを作成するには

  1. オブジェクト エクスプローラーで、非キー列を含むインデックスの作成先となるテーブルが格納されているデータベースを、プラス記号をクリックして展開します。

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。

  3. プラス記号をクリックして、非キー列を含むインデックスの作成先となるテーブルを展開します。

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

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

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

  7. テーブル名から列を選択] ダイアログ ボックスで、インデックスに追加する 1 つまたは複数のテーブル列のチェック ボックスをオンにします。

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

  9. [付加列] タブで、[追加...] をクリックします。

  10. テーブル名から列を選択] ダイアログ ボックスで、非キー列としてインデックスに追加する 1 つまたは複数のテーブル列のチェック ボックスをオンにします。

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

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

Transact-SQL の使用

非キー列を含むインデックスを作成するには

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

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

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

    USE AdventureWorks2022;  
    GO  
    -- Creates a nonclustered index on the Person.Address table with four included (nonkey) columns.   
    -- index key column is PostalCode and the nonkey columns are  
    -- AddressLine1, AddressLine2, City, and StateProvinceID.  
    CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
    ON Person.Address (PostalCode)  
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);  
    GO  
    

CREATE INDEX (Transact-SQL)
SQL Server インデックス デザイン ガイド