Observation: Ascending Key Column Cardinalities(監視レポート:昇順キー列のカーディナリティー)

複合索引に対して定義されたキー列のカーディナリティーは、昇順になっています。索引のカーディナリティーは、索引キー列における特殊な値の数です。DB2オプティマイザーはカーディナリティーを使用して、索引を使用するかどうかや、索引を使用する方法を判断します。

述部を満たす行のパーセンテージの見積もりを示すフィルター係数を算出する際、オプティマイザーは以下のカタログ統計を使用します。

 

カタログ表と説明

FIRSTKEYCARD,

FIRSTKEYCARF (DB2のバージョンが値を浮動に変換した場合)

SYSINDEXES:索引の最初の列の特殊な値の数を含みます。1つの列の索引のフィルター係数を算出する際、オプティマイザーは、FIRSTKEYCARDまたはFIRSTKEYCARDFを使用します。

FULLKEYCARD,

FULLKEYCARDF (DB2のバージョンが値を浮動に変換した場合)

SYSINDEXES:複合索引内の全キーの特殊な値の数を含みます。複合索引の各キーに対して同等の述部をコーディングする場合、オプティマイザーは、FULLKEYCARDまたはFULLKEYCARDFを使用します。

COLCARD,

COLCARDF (DB2のバージョンが値を浮動に変換した場合)

SYSCOLUMNS:複合索引または索引付けされていない列の、先行列以外の列における特殊な値の数の見積もりを含みます。複合索引のすべての列で突き合わせ索引を使用できない場合、DB2はフィルター係数を算出する際にCOLCARDまたはCOLCARDFを使用します。

区分索引の場合は、カタログ表SYSINDEXSTATSからのCOLCARDまたはCOLCARDF列が使用されます。

DB2は、フィルター係数を表の行数とページ数に乗算して、索引の現在のクラスター率に基づいてその値を調節します。DB2は、その結果を使用して、必要な行の検索に必要となる入出力の数を見積もります。フィルター係数が小さくなると、選択基準を満たす表の行が少なくなります。そのため、オプティマイザーがアクセス パスの選択の際に索引を選択する確率が高くなります。

索引に対して定義されたキー列のカーディナリティーが昇順で、複合キーの正しいカーディナリティーを正確に表すのに十分な数の述部のキーを参照していない場合、Db2が索引を使用する確率は低くなります。

たとえば、複合のクラスター化索引I1を表T1の列C1とC2で定義した場合、C1のカーディナリティーは5、C2のカーディナリティーは1000です。また、表T1には20,000の行があり、I1のクラスター率は100パーセントです。これにより、フィルター係数は以下のようになります。

 

フィルター係数

C1

1/5 = 0.2

C2

1/1000 = 0.001

 

列C1だけを参照する述部をコーディングした場合、オプティマイザーは、照会には表ページを検索するために4000(20,000行 * 0.2)の入出力が必要であると見積もります。表が占有しているページ数によって、DB2は4000もの入出力は索引I1の使用に必要でないと判断し、表T1の表スペース スキャンを呼び出します。C2をI1の最初のキーとして定義すると、DB2は照会には20の入出力だけが必要であると判断し、I1を使用するアクセス パスを選択します。