-
a
の場合 およびb
両方とも1000の異なる値を持ち、それらは常に一緒に照会されるため、インデックス内の列の順序は実際には重要ではありません。ただし、a
異なる値が10個しかない場合、または列の1つだけを使用するクエリがある場合は、それが重要です。これらのシナリオでは、列の順序がクエリに適していない場合、インデックスは使用されない可能性があります。 - 最も明確な値の列が最初で、最も明確な値の列が最後である必要があります。これにより、インデックスの有用性が最大化されるだけでなく、インデックス圧縮による潜在的な利益も増加します。
- 列のデータ型と長さは、インデックス圧縮から取得できる戻り値に影響しますが、インデックス内の列の最適な順序には影響しません。
- 最も選択性の低い列を最初に、最も選択性の高い列を最後に配置します。単独で使用される可能性が高いカラムを備えたタイリードの場合。
2.および3.の1つの潜在的な例外は、DATE列の場合です。 Oracle DATE列には時間要素が含まれているため、1日あたり86400の異なる値を持つ可能性があります 。ただし、データ列に対するほとんどのクエリは通常、日要素のみに関心があるため、計算では個別の日数のみを考慮したい場合があります。相対的な選択性には影響しないと思いますが、ほんの一握りの場合です。
編集(ニックピアポイントのコメントに応じて)
最も選択性の低いカラムでリードする2つの主な理由は
です。- インデックス圧縮
- インデックススキップ読み取り
これらは両方とも、現在のスロットの値が前のスロットの値と同じであることを知ることで魔法をかけます。したがって、値が変化する回数を最小限に抑えることで、これらの手法からの収益を最大化できます。次の例では、A
4つの異なる値とB
があります 6つあります。同上は、圧縮可能な値またはスキップ可能なインデックスブロックを表します。
Least selective column leads ...
A B
--------- -
AARDVARK 1
" 2
" 3
" 4
" 5
" 6
DIFFVAL 1
" 2
" 3
" 4
" 5
" 6
OTHERVAL 1
" 2
" 3
" 4
" 5
" 6
WHATEVER 1
" 2
" 3
" 4
" 5
" 6
最も選択的なカラムリード...
B A
- --------
1 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
2 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
3 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
4 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
5 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
6 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
この些細な例でも、(A, B)
(B, A)
の18と比較して、スキップ可能なスロットが20あります。 。格差が大きいほど、インデックス圧縮のROIが高くなるか、インデックススキップ読み取りの有用性が高くなります。
ほとんどのチューニングヒューリスティックの場合と同様に、実際の値と現実的なボリュームを使用してベンチマークを行う必要があります。これは間違いなく、データの偏りがさまざまなアプローチの有効性に劇的な影響を与える可能性があるシナリオです。
「選択性の高い最初のインデックスがある場合は、パフォーマンスの観点から、最初に配置するのが適切だと思います。」
選択性の高い列がある場合は、独自のインデックスを作成する必要があります。少数の行でのFILTER操作を回避することの追加の利点は、複合インデックスを維持するオーバーヘッドによって上回ることはほとんどありません。
複数列のインデックスは、次の場合に最も役立ちます。
- 中程度の選択性の2つ以上の列
- 同じクエリで頻繁に使用されます。