次の例では、評価する列またはインデックスの値のために、間隔ヒストグラムの小さな部分集合を使用します。これらの例は、プロセスの基本的な面を強調するために、かなり簡略化されています。
例を簡略化するため、この例で調べられるテーブルのデータ デモグラフィックは、データが等高間隔で格納される統計です。
ここで説明されていることは、カーディナリティの最初の見積もりのみです。これは、間隔ヒストグラムに格納されている統計に基づいています。最適化ルーチンは、さまざまなデータベース制約、クエリー述部、ハッシュ インデックス、および結合インデックスから派生する情報に基づいたクエリーの最適化の過程で、カーディナリティの見積もりを動的に調整します。このような統計を計算する方法から、その統計は派生統計と呼ばれます(詳細は派生統計を参照)。
下記の例は派生統計を処理しません(派生統計を参照)。これらは、最適化ルーチンが見積もりを行なうための基礎として間隔ヒストグラム内の統計のみを保有していた場合に、それがカーディナリティの見積もりをどのように行なうかを示しています。
最適化ルーチンは、カーディナリティを見積もるときにDBC.ObjectUsageからのUDIカウント データも使用します。詳細については、オブジェクト使用カウントとUDIカウントを参照してください。
間隔ヒストグラムのデータ
標準的な等高間隔で格納される主な情報は次のような情報です。
- 間隔の最大値
- 間隔の最高頻度の値
間隔の最頻数値として記録されます。
- 間隔の最高頻度の値のカーディナリティ
間隔の最頻度数として記録されます。
- フル テーブル スキャンから決定される間隔の固有値のカーディナリティ。
- 最高頻度の値とは等しくない間隔内の値のカーディナリティ。
この数は、等高間隔を使用するときの、間隔と間隔の間にある定数です。
この値は、次のように計算されます。
1という因子は、間隔でもっとも頻出する固有値の数を示します。
- 間隔での最高頻度の値を含まない行のカーディナリティ。
間隔の非最頻数頻度として記録されます。
例で使用されているデータが下のテーブルにまとめられています。固有値(テーブルの影付きのセル)の合計数は、5つの間隔すべてで同じである点に注意してください。これは、理論上、等高間隔ヒストグラムだけに限られたものです。実際には、等高間隔の間隔のカーディナリティは、ほぼ等しいというだけです。例を単純化するために、履歴間隔は示されていません。
変数 | 間隔番号 | ||||
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | |
間隔の最高頻度の値のインスタンス | 16 | 36 | 39 | 60 | 67 |
間隔の最高頻度の値とは等しくない値の数 | 10 | 10 | 10 | 10 | 10 |
間隔の固有値の数 | 11 | 11 | 11 | 11 | 11 |
最高頻度の値を含む間隔の行数 | 50 | 70 | 20 | 30 | 50 |
最高頻度の値を含まない間隔内の行数 | 200 | 150 | 250 | 100 | 200 |
間隔の行数 | 250 | 220 | 270 | 130 | 250 |
間隔の最大値 | 25 | 37 | 50 | 63 | 76 |
次の図は、これらの数をグラフで示したものです。陰影が付けられた領域は、間隔内のその他の値に関する行数を表わしています。一部の値には上付き文字の注釈が付けられており、これは図の後のテーブルで定義されています。
図の注釈番号 | 説明 |
---|---|
1 | 最高頻度の値を間隔の中に列またはインデックスの値として持っている行数。 |
2 | 間隔の列またはインデックスの最高頻度の値。 |
3 | 最高頻度の値を間隔の中に列またはインデックスの値として持っていない行数。 |
4 | 列またはインデックスの最高頻度の値と等しくない、間隔内の固有値の数。 |
5 | 間隔の最大値 |
列セットの統計が最新であるためこの簡単な問合わせの応答セットのカーディナリティを見積もる必要がない場合、最適化ルーチンはカーディナリティを正確に把握することになります。テーブルには、値60のインスタンスが30個あります。この値は、条件で指定された列のために間隔内で最高頻度の値60を持つ行数をカウントしたものなので、既知のものです。
この例は、簡単な等式条件を示しています。
指定した列の値が55という条件を満たす行があれば、間隔の下限の51から上限の63の間の範囲に見つかります。
最適化ルーチンは、この条件について、次の点を把握しています。
- 等式であること。
- 等式の範囲が1つの間隔上にあること。
- 間隔内の最高頻度の値が原因となり、応答セットに含める行とは認められないこと。
前述の例とは異なり、記述する正確な統計が存在しないため、最適化ルーチンは、この例の応答セットのカーディナリティを見積もる必要があります。応答セットのカーディナリティを見積もるために使用される経験則は、最高頻度の値と等しくない間隔内の値の数によって、最高頻度の値を持たない間隔内の行数を除算することです。
統計が最新であれば、間隔内には条件で指定した列のために値30を持たない100の行があり、間隔内の最大頻度の値と等しくない10の値があります。最適化ルーチンは、最大値と等しくない間隔内の値の数(10)で、値30を持たない間隔内の行数を除算します。応答セットのカーディナリティは10行であると見積もられます。
この例では、範囲の条件を指定します。統計ヒストグラム方式は、範囲問合わせ応答セットのカーディナリティを見積もるための、特に強力な手段です。
最適化ルーチンは、51から57までの条件列の値を持つ行数が、値51と63で区切られた1つの間隔内に必ず存在することを知っています。
キーワードのBETWEENは、値 ≥ lower_limit AND ≤ upper_limitのSQL簡略方式であり、不等式条件を意味します。
最適化ルーチンは、この条件について、次の点を把握しています。
- 不等式であること。
- 不等式の範囲は、1つの間隔上にあること。
- 間隔内の最高頻度の値が原因となり、応答セットに含める行とは認められないこと。
記述する正確な統計が存在しないため、最適化ルーチンは、この例の応答セットのカーディナリティを見積もる必要があります。応答セットのカーディナリティを見積もるために使用する経験則は、間隔内で最高頻度の値を持たない行数を半分に除算することです。
最新の統計では、間隔内には条件で指定した列のために値30を持たない行が100個あるので、最適化ルーチンは値60を持たない行数(100)を半分に除算します。
応答セットのカーディナリティは50行であると見積もられます。
この例は、間隔内で見つかる最高頻度の値を含めた範囲述部を指定しているため、前述の例と比べてやや高度になります。
最適化ルーチンは、51から60までの条件列の値を持つ行数が、値51と63で区切られた1つの間隔内に必ず存在することを知っています。
最適化ルーチンは、この条件について、次の点を把握しています。
- この条件は不等式であること。
- 不等式の範囲は、1つの間隔上にあること。
- 間隔内の最高頻度の値は、応答セットに含められる行を満たしていること。
記述する正確な統計が部分的にしか存在しないため、最適化ルーチンは、この例の応答セットのカーディナリティを見積もる必要があります。応答セットのカーディナリティを見積もるために使用される経験則は、間隔内で最高頻度の値を持たない行数を半分に除算し、その数を最高頻度の値を持つ間隔内の行数に加算することです。
統計が最新であれば、この大きさは正確に把握されているので、応答セットの見積もりカーディナリティは前の例よりもさらに正確になっているはずです。
間隔内には条件で指定した列に対して値30を持たない行が100個あるので、最適化ルーチンは値60を持たない行数(100)を半分に除算し、存在することが知られている30行を条件が60の場合に追加します。
この例は、応答セットが2つのヒストグラム間隔にまたがるため、前述の例よりもやや複雑な範囲問合わせになっています。
最適化ルーチンは、45から55までの条件列の値を持つ行数が、値38と63で区切られた隣接する2つの間隔内に必ず存在することを知っています。
最適化ルーチンは、この条件について、次の点を把握しています。
- 不等式であること。
- 不等式の範囲が2つの間隔上にあること。
- どの間隔内の最高頻度の値も、応答セットに含められる行を満たしていないこと。
記述する正確な統計が存在しないため、最適化ルーチンは、この例の応答セットのカーディナリティを見積もる必要があります。経験則は、間隔内の最高頻度の値を持たない行数を半分に除算し、それら2つのカーディナリティを合計することによって、応答セットのカーディナリティを間隔ごとに個別に見積もることです。
低い方の間隔内には条件で指定した列に対して値20を持たない行が250個あるので、最適化ルーチンは値20を持たない行数(250)を半分に除算し、その間隔の条件を満たす行数の見積もり125を出します。
高い方の間隔内には条件で指定した列に対して値30を持たない行が100個あるので、最適化ルーチンは値60を持たない行数(100)を半分に除算し、その間隔の条件を満たす行数の見積もり50を出します。
見積もりの合計は、2つの間隔それぞれの見積もりを加算して求めます。
最後の例では、3つの間隔にまたがる範囲問合わせを指定し、最高頻度の値を中間の間隔に組み込みます。
最適化ルーチンは、45から50までの条件列の値を持つ行数が、値38と50で区切られた間隔内に必ず存在することを知っています。
さらに最適化ルーチンは、値51と63で区切られた、次に高い間隔にあるすべての行が、応答セットに組み込まれることも知っています。見積もりは、間隔内で見つかる最高頻度ではない値を持つ行数と、最高頻度の値を持つ行数、すなわち100 + 30を合計することによって計算されます。統計が最新であれば、この値は正確です。
64から65の範囲で条件列の値を持つ行数は、間隔内で見つかる最高頻度ではない値の個数の半分の値を使用して見積もる必要があります。見積もりは、200の半分、すなわち100行になります。
最適化ルーチンは、この条件について、次の点を把握しています。
- 不等式であること。
- 不等式の範囲が3つの間隔上にあること。
- 一番低い間隔と一番高い間隔内の最高頻度の値は、応答セットに含められる行を満たしていないこと。
- 中間の間隔内の最高頻度の値は、応答セットに含められる行を満たしていること。
記述する正確な統計が部分的にしか存在しないため、最適化ルーチンは、この例の応答セットのカーディナリティを見積もる必要があります。応答セットのカーディナリティを見積もるために使用する経験則は、次のとおりです。
- 最高頻度の値を持たない行数を半分に除算することにより、最初の間隔から返される応答セットのカーディナリティを見積もります。
- 2番目の間隔から最高頻度の値を持つ行のカーディナリティを読み取ります。
- 2番目の間隔から最高頻度の値を持たない行のカーディナリティを読み取ります。
- 最高頻度の値を持たない行数を半分に除算することにより、3番目の間隔から返される応答セットのカーディナリティを見積もります。
- ステップ1から4で除算して求めた数を加算し、応答セットのカーディナリティを全体的に見積もります。
見積もりの合計は、3つの間隔それぞれの見積もりを加算して求めます。 125 + 130 + 100、すなわち355行になります。
これらの例のすべてが、問合わせの最適化で間隔ヒストグラムがどのように使用されるかを示しているにすぎないことに注意してください。これらは、派生統計とUDIカウントで、カーディナリティの見積もりをより正確に行なうために使用される方法を示しているわけではありません。