私は H2 を使用しており、次のような単純なクエリがあります。
SELECT DISTINCT col
FROM PUBLIC.TABLE;
H2 は、選択性が低く、col に一意でないインデックスがある場合でも、完全なテーブル スキャンを使用します。
私はこれをチェックして実行しました:
SELECT SELECTIVITY(CLUSTERNODE ) FROM PUBLIC.TRANSFORMATION;
「1」を返しました。
何か案は?
選択性 (カーディナリティ) が低いにもかかわらず、既存のインデックスが DISTINCT クエリで H2 によって使用されない理由は、列の選択性を判断するために使用されるテーブル統計を内部で保持しているためです。全て。
ドキュメントによると、新しいバージョンではそれらは自動的に更新されますが、ある程度のINSERT(または他の突然変異)が必要なようです。少なくとも私の場合、アップグレードだけではうまくいきませんでした(1.2.143からアップグレードしました1.3.171 に)。
「分析」更新クエリを実行するだけで、すべてがうまくいくはずです。私の場合、実行時間はほぼ 1 分から 300 ミリ秒に短縮されました。