オラクル10g.
varchar2 列でパーティション分割された大きなテーブルがあります (私に任せれば、この列ではありませんが、そうです)。各パーティションには単一の値があります。元。パーティション "PARTITION1" 値 ('C')。
NLS_COMP = LINGUISTIC もあります。
その列の値を示す場合、パーティションのプルーニングは機能しません。
SELECT * from table1 where column_partitioned_by = 'C'
これにより、関連するパーティションだけでなく、すべてのパーティションで完全なテーブル スキャンが実行されます。
こちらのドキュメントによると 、「NLS_COMP パラメータは、分割されたテーブルの比較動作には影響しません。」
私が発行した場合:
ALTER SESSION SET NLS_COMP = BINARY
その後:
SELECT * from table1 where column_partitioned_by = 'C'
パーティションを正しくプルーニングします。(私は、生成された計画から剪定/剪定しないことに基づいています)
パーティション名を from 句にハードコーディングする以外に、ここで機能するものはありますか?
さらに、パーティション定義の変更もアウトです。これを問題と見なすことさえあるので、私はチームの少数派です。私がそこに着く前に、前のチームは、FROM 句にハードコーディングされたパーティション名を追加し、誰かにストアド プロシージャのパーティション名を手動で更新させる文字列の検索と置換を介して、すべてのアプリケーション SQL クエリを送信することで、この問題を「解決」することを決定しました。必要に応じて...しかし、いつか壊れて、激しく壊れます。最も侵襲性の低いアプローチを見つけようとしていますが、そうではないかもしれません。
できれば、基になるデータベース構造ではなく、クエリ自体のみを変更するソリューションになります。私が言ったように、この解決策は単に存在しないかもしれません...