初めてユーザー定義関数で関数ベースのインデックスを使用していますが、インデックスを使用できないときにパフォーマンスの問題に遭遇しました。
内部的には、関数ベースのインデックスは非表示のテーブル列 (関数が varchar2 を返すため、varchar2(4000) 型) を生成するように見え、それをインデックス化します。インデックスが使用されている場合は正常に機能しますが、関数をフィルターとして使用して完全なテーブルスキャンを実行する必要がある場合があり、その場合、パフォーマンスが 6 分の 1 に低下します。その場合、Oracle は使用しないようです非表示の列を削除しますが、行ごとに関数を再計算し、クエリを IO バウンドではなく CPU バウンドにします。
Oracle でその非表示の列をフィルタリングにも使用する方法はありますか? いくつかの書き換えオプションまたはそれらの線に沿った何かが欠けているのだろうか。
そうでない場合は、自分で列を定義し、トリガーを使用して最新の状態に保つ必要があります。透明性とメンテナンスの容易さのために、関数ベースのインデックスを使用することをお勧めします。