私はこの質問に対する答えをすでにある程度知っていますが、私は常にトピックについて取り上げる必要があると感じています。
私の基本的な理解は、一般的に言って、特定の時点でクエリ/ソートを行う可能性のあるすべてのフィールドを含む単一のインデックスは有用ではない可能性が高いということです。誰かが考えたように、「まあ、すべてのものをインデックスに入れると、データベースはそれを使って必要なものを見つけることができます」、実際に実行されているクエリの実行計画を見たことがありません。
次のようなテーブルを想像してください。
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
およびフィールドを含む単一のインデックスが表示されるname
場合がcustomerId
ありdateCreated
ます。
しかし、私の理解では、そのようなインデックスは、たとえば次のようなクエリでは使用されません。
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
このようなクエリの場合、より良いアイデアは、フィールドが「最初」であるフィールドcustomerId
とdateCreated
フィールドを含むインデックスになると思われますcustomerId
。これにより、このクエリが必要なものを必要な順序ですばやく見つけることができるようにデータが編成されたインデックスが作成されます。
私が見るもう1つのことは、おそらく最初と同じくらい頻繁に、各フィールドの個々のインデックスです。そう、1それぞれにname
、customerId
そしてdateCreated
フィールド。
最初の例とは異なり、このタイプの配置は、少なくとも部分的には役立つように思えます。クエリの実行プランは、少なくとものインデックスを使用customerId
してレコードを選択しているが、dateCreated
フィールドのインデックスを使用してレコードをソートしていないことを示す場合があります。
テーブルの特定のセットに対する特定のクエリに対する具体的な答えは、通常、実行プランが実行することを示していることを確認することであり、そうでない場合はテーブルとクエリの詳細を取得することであるため、これは広範な質問であることを知っていますアカウント。また、クエリの特定のインデックスを維持するオーバーヘッドとは対照的に、クエリが実行される頻度に依存することも知っています。
しかし、私が求めているのはインデックスの一般的な「開始点」であり、頻繁にプルされる特定のクエリとWHERE句またはORDER BY句のフィールドに特定のインデックスを付けるという考えは意味がありますか?