0

オラクル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 クエリを送信することで、この問題を「解決」することを決定しました。必要に応じて...しかし、いつか壊れて、激しく壊れます。最も侵襲性の低いアプローチを見つけようとしていますが、そうではないかもしれません。

できれば、基になるデータベース構造ではなく、クエリ自体のみを変更するソリューションになります。私が言ったように、この解決策は単に存在しないかもしれません...

4

1 に答える 1

1

プロトタイプのいくつかの解決策:

CAST関数。式で分割できます。欠点は、アプリケーションが同様の式を提供する必要があることです。

のパーティションNLS_SORT(column_partitioned_by, 'NLSSORT=BINARY')。ここでも、アプリケーションの変更が必要です。

column_partitioned_by数値への変換、場合によってはコード テーブルを使用して 2 つの値を変換します。ただし、アプリケーション全体でそのテーブルへの結合を含める必要があります。

于 2010-02-18T19:13:08.667 に答える