2012-08-28 5 views
6

多くのSQLの書籍や記事では、インデックスの作成において選択性が重要な要素であることを読んでいます。列の選択性が低い場合、インデックスシークはその優位性をより害する。しかし、記事のどれも理由を説明していない。それがなぜそうであるか説明したり、関連記事へのリンクを提供することができますか?ロバート・シェルドンによってSimpleTalk物品からインデックススキャン/シークにおける選択性の役割

答えて

7

14 SQL Server Indexing Questions You Were Too Shy To Ask

キー列内のユニークな値の比を指標 選択性と呼ばれています。よりユニークな値であるほど、選択性が高くなります。 これは、ユニークなインデックスが可能な限り高い選択性を持つことを意味します。 クエリエンジンは、特に 実行クエリのWHERE節で の列が参照されている場合は、非常に選択的なキー列が大好きです。選択性が高いほど、クエリエンジンが高速になります 結果セットのサイズを減らすことができます。もちろん、フリップサイドは、 であり、比較的少数の固有値を持つ列は、ほとんどインデックス化されない候補の です。

また、これらの記事をチェック:

  • チェックthis post Pinalデイブによって
  • this other SQL Serverpedia上
  • This forum post SqlServerCentralにはあまりにもあなたを助けることができます。 SqlServerCentral上
  • This article SqlServerCentral記事からも

:一般的に

、非クラスタ化インデックスを選択する必要があります。つまり、列内の の値はかなりユニークである必要があり、その上のフィルタ がテーブルの小さな部分を返すようにクエリします。

この理由は、RID /キールックアップが高価な操作 であり、非クラスタ化インデックスは、それが検索 のコストではないことをカバーするか、十分に選択することが を必要とするクエリを評価するために使用される場合ということです高すぎると思われる。

SQLが不十分選択インデックス(または クエリが上で求めていることになるインデックスキーのサブセットが)、インデックスは無視され、クエリが クラスタ化インデックスとして実行されたことを非常に 可能性があるとみなした場合(テーブル)スキャン。

これは、先頭の 列にのみ適用されるものではありません。非常に非選択的な列が先頭の列として使用される であり、インデックスの他の列が使用されるのに十分に選択的であるようなシナリオがあります。

+0

ダウンタイムやひどい顔をユーザから避けるために、実稼働前にテストしてください。 – Yaroslav

2

私は(SQL Serverのの私の現在の知識に基づいて)非常に簡単な説明を記述しよう:

指数が低い選択性を有する場合は、同じ値の合計行の大きな割合があることを意味見つかりました。(500行からの200のように、インデックスに基づいて同じ値を持っています)

通常、インデックスに必要なものすべての列情報が含まれていない場合は、ポインターを使用しています。インデックス上の "エントリ"に接続します。次に、secpndステップで、エンジンはその行を読み出す必要があります。

このように2段階で検索すると、そして、ここに選択性が来る:

多くの結果は、エンジンがしなければならないより低い選択性のより多くの二重の仕事を得る。だから、テーブルスキャンでさえ効率が良く、次に選択性が非常に低いインデックスシークがあるという事実から、いくつかのケースがあります。

+0

しかし、結果の数はテーブルスキャンの方が多くなります。少なくともインデックスシークの場合、類似したレコードを含むデータブロックの部分へのジャンプはより速い。 – SexyBeast

+1

しかし、テーブルスキャンでは、obeレコードを一度読み取っています。二度も読み取れません。そして、プロセス全体で最もコストがかかるssdハードドライブでは、「ヘッドモーブ」時間を計算する必要があります。 –

関連する問題