DB2 LUW データベースのいくつかのクエリの最適化に取り組んでおり、いくつかの既存のインデックスを再構築する予定です。ただし、少なくとも私が見つけたものからは、明確に定義されていないように見える主題についていくつか質問があります。まず、クエリ自体の概要を次に示します。
SELECT
--About a dozen fields from TABLE A--
--A few fields from joined tables--
FROM
TABLE A
--A few inner join/left joins, mostly on A.ID1 and A.ID2, BIGINT generated keys--
WHERE
A.ONE = :x
AND A.TWO IN (:y)
AND A.THREE IN (--uncorrelated suquery--)
AND A.FOUR IS NULL
AND (A.FIVE BETWEEN :date1 AND :date2
OR
A.SIX = 'STUFF')
ORDER BY A.SEVEN
いくつかの注意事項:
- A.ID1 と A.ID2 だけにインデックスがあります。これは主キーであるため、クラスター化されたインデックスである可能性があります。
- A.SEVENに目次あり
- WHERE 句の残りのフィールドのインデックスを修正しています
したがって、すべての結合/フィルター/順序列にインデックスが付けられます。問題は次のとおりです。それらをすべて 1 つのインデックスに結合する必要がありますか、それとも個別のままにしておく必要がありますか? A.SEVEN を同じインデックスに配置した場合、選択性に従って配置したいですか、それともフィルタリングがなく、並べ替えのみであるため、無関係でしょうか?
編集:少なくとも私が使用しているクエリでは、OR句の代わりに高速な代替手段を使用していることに気づきました:
CASE WHEN (first statement) THEN 1
WHEN (second statement) THEN 1
ELSE 0
END = 1
これは一部のクエリでは驚くほど効果的ですが、OR 句と比較してインデックスの使用に影響するかどうか、またはどのように影響するかはわかりません。さらに、ONE から FOUR までを選択性の順に編成するのが最適ではないでしょうか。つまり、FOUR に 12 個の異なる値しかなく、ONE に 10k しかない場合、ONE をインデックスの先頭に配置するのが最適です。