数百のカーディナリティの高い列と数百万のレコードを持つテーブルに対するアドホック クエリのパフォーマンスを向上させる方法は?
私の場合、1 つのインデックス付きDATE
列SDATE
、1 つのVARCHAR2
列NE
、および 750 の数値列を持つテーブルがあり、そのほとんどが の範囲の値を持つカーディナリティの高い列です0 to 100
。テーブルはほぼ20000
新しいレコードで 1 時間ごとに更新されます。このテーブルに対するクエリは次のようになります。
SELECT * FROM TAB WHERE SDATE BETWEEN :SDATE AND :EDATE AND V1 > :V1 AND V3 < :V3
また
SELECT * FROM TAB WHERE SDATE BETWEEN :SDATE AND :EDATE AND NE = :NE AND V4 > :V4
等
これまでのところ、日付インデックス アクセス パスから生成されるレコード数を制限するために、大きな間隔の日付を入力しないようにユーザーに常にアドバイスしてきました。ただし、場合によっては、より大きな間隔を指定する必要があります。
V1, V2, ..., V750
すべてカーディナリティの低い列であれば、ビットマップ インデックスを利用できたはずです。残念ながらそうではありません。
これについてのアドバイスは何ですか?この問題にどのように取り組むべきですか?
ありがとう。