2009-07-09 8 views
2

SQL Server 2005のデータベースにインデックスを付けた場合、私はこの製品テーブル被覆インデックスヘルプは、主キー、外部キーがある場合...フィールドは、すでに個別

ProductID (PK) 
ProductCategoryID (IX) 
Description 
Price 
ExpiryDate 
BreakableYN 

のようなテーブルの多くを持つことになりますし、次に他のフィールドの束。このタイプのテーブルの別の特徴は、多くのクエリが2つのIDフィールド(ProductID、ProductCategoryID)のみを使用することである。 Employees JOIN EmployeeProductJoin JOIN Products JOIN ProductCategories JOIN ProductDepartments

ProductIDとProductCategoryIDがすでに索引付けされている場合、ProductID、ProductCategoryIDの別の索引を追加する価値はありますか?

私はそれがカバーインデックスを追加するのに役立ちます場合、私は求めているようだけど、私が本当に求めていると、その被覆インデックス内のフィールドは、すでに個別インデックス化されている場合は、カバーインデックスが役立つかどうかです。はい、それはかもしれないなど

答えて

1

プライマリキーはクラスタ化されていますか?そうであれば、ProductCategoryIDインデックスにすでにProductID値が含まれているため、新しいインデックスを追加すると何も成立しないため、実質的に両方のカラムをカバーします。

+0

Downvoted:この新しいインデックスは、クラスタ化されたものよりも多少(おそらく100倍)小さい場合があります。 –

+0

アレックス、それは無関係です。すべてのノンクラスタード・インデックスには、クラスター化キーが含まれています。 PCIDの非クラスタ化インデックスにはPID + PCIDデータが含まれ、PID + PCIDの非クラスタ化インデックスにはPID + PCIDデータも含まれますが、PIDはインデックスキーと行ポインタにも複製されます。したがって、それは冗長です。 –

+0

はい、プライマリキー(ProductID)はクラスタ化されています。私はあなたの反応を明確にしたいだけです。 ProductCategoryIDにインデックスを作成すると、そのインデックスはProductCategoryIDとProductIDで構成されます(ProductIDはクラスタ化インデックスなので)。だから、私は既にProductID、ProductCategoryIDのインデックスを持っています! –

1

これらは巨大ではない定義テーブルですので、私は、挿入に余分な時間を追加することについて心配していません。カバリングインデックスのポイントは、テーブルにアクセスすることなく、インデックスだけでクエリを処理できることです。したがって、検索対象のフィールドだけでなく、返すフィールドも含めます。クエリオプティマイザは、テーブルへのアクセスをまったく避けることができます。

あなたは本当に(余分なインデックスを持つとせずに、データの現実的な量と種類を含むテーブル付き)のみのクエリ・プランがあれば確実にあなたを伝えることができます...しかし

+0

カバーインデックスではありませんか?私は、クエリが必要とするすべてのフィールドを含むインデックスを作成する限り、カバーインデックスを持っていると考えました。 –

+0

選択している列によって異なります... –

0

「をカバーするインデックス」を意味しない場合があります余分なインデックスが役立ちます。クエリーオプティマイザがよりスマートなプランを見つける手助けをしていますが、これまでのところ助けが必要なのはです。あなたが望むプランを見つけることができないかもしれないと考えられる(ヒューリスティックな "最適化を試みましょう"エンジン、結局)。そのため、クエリプランを調べることは非常に重要です(実際にはヒューリスティックに影響を及ぼすため、実際のデータが必要です)。

0

あなたの説明が大きい場合は、間違いなく助けになるかもしれません。ベンチマークして自分自身で見るのは簡単でしょう。この新しいインデックスは、クラスタ化されたインデックスよりもはるかに小さいかもしれません。 しかし、あなたが非常に重要なクエリを持っている場合は、この狭いインデックスを必要とします。

0

はい、特定の方法で役立ちます。カバリングインデックスの考え方は、クエリーで使用している冗長フィールドがいくつかあることです。索引が基礎となる表にヒットする必要なく、索引がデータ要件を満たすことができる場合は、索引からデータを取得することで入出力を節約できます。

上記のように2つのインデックスがある場合、DBMSは2つのインデックスシークを解決するだけでなく、テーブルにヒットする必要があります。

クエリの結果がテーブルに広く散在していても、インデックスにまとめられていると、大規模なクエリで非常に多くのI/Oを節約できます。このようにして、カバー索引は、表上の一種の「第2のクラスター化索引」として使用することもできます。

+0

私はあなたの答えによって混乱しているので、私はそれを誤解していると推定されます。カバリング・インデックスの原則は、単一の索引内に問合せによって必要とされるすべての列を組み込むことです。なぜ、クエリに冗長な列が存在するのですか?つまり、インデックスでは満たされないのですが、これはカバリングインデックスではありません。おそらく、カバリングインデックスには追加の列だけでなく、クエリで必要なカバレッジも含まれている可能性があるので、カバレッジを提供することをお勧めしますか? –

+0

列は索引付けの目的で冗長です。つまり、追加の列は選択を解決する必要はなく、問合せによって戻されるデータを含みます。 – ConcernedOfTunbridgeWells

0

要するに、クエリのパフォーマンスが向上します。

索引索引を使用すると、問合せに必要なすべての列が索引データ構造内に存在します。つまり、クエリの結果を提供するために、SQL Serverは単一のインデックスのみをクエリする必要があります。

このクエリを処理するために、複数の列のシナリオが別々にインデックス付けされている場合、SQL Serverは単なるインデックスではなく多数のインデックスのシーク/スキャンを実行する必要があります。もちろんこれは、より多くのI/Oアクティビティを作成する可能性があります。

意味がありますか?

関連する問題