わかりました、もう一度詳しく説明する必要があります。オンラインで記事を読みましたが、まだ決定的な答えが見つかりません。
SQL Server 2008 には、約 50,000 レコードの「コア」テーブルと、すべてのクエリで同じ方法で使用される多数の読み取りアクティビティがあります。このデータは 1 か月に 1 回更新され、1 秒間に数百回読み取られます。
データは頻繁にアクセスされるため、フィールドにクラスター化されたインデックスがあります。クラスター化インデックスが次のようになっているとします。
クラスタ化されたインデックス
Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
現在、それよりも多くのデータはありません。そのため、余分な列を「含まれる列」に入れることは理にかなっていますが、SQL Server ではクラスター化インデックスに列を含めることはできません。
したがって、クラスター化インデックスと本質的に同じフィールドを持つ 2 番目のインデックスがあり、他の列は "含まれる列" です。しかし、私が読んだことから、これは冗長であると思いますか?
COVERING INDEX (非クラスター化)
Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
含まれる列
Field6 varchar(96)
Field7 varchar(96)
非クラスター化インデックスには、クラスター化インデックスの列が既に定義されていますか?
もしそうなら、どのようにしてこの 2 番目のインデックスをまったく列なしで作成できますか (クラスター化インデックスに既に含まれているもの以外に)? 言い換えれば、「このインデックスはクラスター化インデックスとまったく同じです... いくつかの列が含まれています」と言いたいのです。
それとも、すべての列 (レコードを識別しない 2 つを含む) をクラスター化インデックスに入れる方がよいでしょうか? varchar 列はより頻繁に (月に 1 回ではなく 1 日に数回) 更新されるため、クラスター化インデックスから除外したかったのですが、それらは十分に深いため、インデックス ツリーは、変更が発生したときにリバランスを引き起こすのに十分です。
では、このテーブルのすべての列がテーブルに戻らずにインデックスを介して利用できるように、これらのインデックスを設定する効率的な方法はありますか?