検索可能なすべての列に非クラスター化インデックスを作成する必要がありますか、それとも各列に個別に作成する必要がありますか?
On 2月 15, 2021 by admin非クラスター化インデックスを適切に使用するかどうかわかりません。 SSMSプランエスティメータは、次のインデックスがすでにテーブルにある場合に別のインデックスを追加すると言いました。
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
クエリは
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
私の質問は…考えられるすべてのルックアップキーのインデックスを作成する必要がありますか?さまざまなクエリでmzone、iso、postalで検索します。
ありがとうございます
コメント
- からのすべての列を含めていますかテーブル?
- はい、すべての列を含めます。
- 1つのインデックスにすべての列を含めても、あまり役に立ちません。このようなインデックスは、基本的にスペース要件を2倍にします。次に、左端のn列にのみ使用できます。テーブルの17番目の列の検索が魔法のように速くなることはありません。
- 列ごとに個別のインデックス(いつか検索する可能性があるという理由だけで)もあまり良くありません。インデックスにはコストがかかります-挿入、更新、削除のたびにパフォーマンスが向上します。 ' t overindex -インデックスがまったくない場合よりも'はほとんど悪いです…
- コメント@marc_sをありがとうございます。まさに私が探していた情報です。また、非クラスター化インデックスの範囲が適切であると言うのは適切ですか(たとえば、5〜10の間)、それとも純粋にテーブルのニーズに関連しているのでしょうか。もしそうなら、それはどのようなものに関連していますか?
回答
SQLServerはインデックスを表示しますインデックスは生活を楽にするだろうと推定しているので、使用したいと思います。検索可能なすべてのフィールドにインデックスを作成する必要はありません。実際、作成すると書き込みパフォーマンスが大幅に低下します。特定のテーブルに5〜10個未満のインデックスがあり、そのクエリを常に実行している場合は、SSMSが示すとおりに、提案されたインデックスを追加することをお勧めします。
JNKの以下の編集
提案されたインデックスを一緒に確認することも重要です。提案はすべて、いわばサイロ化されているため、提案されたインデックス全体を、別のインデックスにINCULDE
dフィールドを追加することで置き換えることができます。
たとえば、次の2つのインデックスについて提案することができます。
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
実際には、次の方法で両方のニーズを満たすことができます。
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
これは、INCLUDE
<に1つのフィールドを追加する、はるかに複雑なインデックス(10〜20のキーフィールド、10〜20の含まれるフィールド)で見たことがあります。 / div>リストを使用すると、2番目のインデックスが不要になります。
コメント
- @MaxVernon: SQL Serverインデックスへの階段-パート1、インデックスの概要、そしてシリーズの残りの記事-は、イントロから高度なトピックまで、SQLServerインデックスに関するほとんどすべてをカバーしています
- @MaxVernon:または、作成する包含列の説明については、包含列を使用したカバーインデックスを参照してください。 eインデックス"カバー"
回答
新しいインデックスを作成するように指示されている理由は、所有しているインデックスが可能な限り最適なインデックスではないためです。クエリオプティマイザは、使用するインデックスを選択する方法で非常に選択的です。次のリンクは、選択性を理解するのに役立ちます。
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
上記で、インデックス内にすべての列を含めたとおっしゃいましたが、基本的にはテーブルデータを複製しています。これに基づいて、あなたが言及した列に3つの別々のインデックスを作成することの害は何でしょうか?使用されるスペースは少なくなり、速度ははるかに速くなります。これがDTA /実行計画があなたに言っていることだと推測するのは危険です-まったく別の方法で。
クエリによって生成された実行プランの詳細を見て、ボトルネックがどこにあるかを特定し、それをインデックスの設計方法に関するガイドラインとして使用します。 SQL Serverは、何が最善かを知るのに非常に優れています。つまり、SQL Serverが何を伝えているかを信頼してください。
これがお役に立てば幸いです。
コメントを残す