1

レガシー システムの非常に幅の広いテーブルに対する SQL クエリの最適化に取り組んでいます。さまざまな理由により、現時点ではテーブルを絞り込むことができません。

作成したインデックスに対してインデックス シークを実行し、ブックマーク ルックアップを使用して必要な追加の列を検索し、インデックスに存在しないため、クエリの実行が遅くなります。ブックマーク ルックアップは、クエリ時間の 42% を占めます (クエリ オプティマイザによると)。

テーブルには 38 の列があり、その一部は nvarchars であるため、すべての列を含むカバリング インデックスを作成することはできません。すべての列をカバーするインデックスを作成してインデックスの交差を利用しようとしましたが、これらの「カバーする」インデックスは実行計画によって選択されず、使用されません。

また、38 列のうち 28 列がこのクエリによって引き出されるため、テーブル内の列の 28/38 がこれらのカバー インデックスに格納されることになるため、これがどの程度役立つかはわかりません。

ブックマーク ルックアップは十分に優れていると思いますか、それとも別の選択肢は何でしょうか?

(これが SQL Server 2000 であることを指定する必要があります)

4

2 に答える 2

1

おー、

include を使用したカバリング インデックスが機能するはずです。別のオプションとして、必要な列のみを含む クラスター化インデックス付きビューを作成することもできます。

よろしく、
リーベン

于 2009-02-24T21:27:01.427 に答える
1

別のオプションとして、列を含むインデックスを作成できます

BOL の例。これは 2005 年以降のものです。

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
    ON Person.Address (PostalCode)
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

この部分に答えるために、「すべての列をカバーするインデックスを作成してインデックスの交差を利用しようとしましたが、それらの「カバーする」インデックスは実行計画によって選択されず、使用されません。」インデックスは、クエリが検索可能な方法で作成された場合にのみ使用できます。つまり、演算子の左側で関数を使用するか、WHERE 句でインデックスの最初の列を除外すると、インデックスが優先されます。使えません。インデックスの選択性が低い場合、インデックスも使用されません

詳細については、インデックスをカバーする SQL Server を確認して ください。

于 2009-02-24T21:17:54.117 に答える