- PR -

パーティション・プルーニングとバインド変数について

1
投稿者投稿内容
ゆいたん
ベテラン
会議室デビュー日: 2004/08/26
投稿数: 91
投稿日時: 2005-01-05 11:03
件名につきまして、ご質問させていただきます。

【環境】
Oracle9i 9.2.0.3 Enterprise Edition (Solaris 8)

【やりたいこと】
バインド変数を利用した処理でパーティション・プルーニングをCBOに選ばせたい。

【やったこと】
1.レンジパーティション(8分割)しているテーブルで
 実行計画をサンプル率20%で取得。
 テーブルの列は次のようなもの
 
 Partition_Key Char(8)
 Primary_Key Char(8)
 Data_1 number
 Data_2 date
 Data_3 char(n)
 Data_n varchar2(n)

 インデックスもパーティション化されている。
 Partition_Key、Primary_Keyを使用。

2.次のSQLを実行(Partition_KeyとBind_Valueはchar型で定義)
 Select * From Target_table where Partition_key = :Bind_Value

【結果】
実行計画が次のようになり、パーティション・プルーニングが動作せず、
実効性能がプルーニングが聞いた場合より劣化する。
1.インデックスに対するレンジスキャン
2.ローカルインディックスを使用したROWID確定
3.パーティション確定

【回避策】
バインド変数ではなく定数で与えればプルーニングが動作する。
プルーニングが効いた場合はテーブル(実際へは単一パーティション)への
フルアクセスが実行計画として選択されている。

実際は、バインド変数を使用したいわけではなくPL/SQLからの実行を行っており、
結果、バインド変数となってしまっています。
とりあえず、PL/SQL内でも動的PL/SQLとすることで回避可能です。
本数も少ないので動的に置き換えてと考えていますが、
なぜパーティションプルーニングが効かないのでしょうか?

なにか情報がありましたらお願いいたします。
記述が足りない場合はご指摘ください。

以上
1

スキルアップ/キャリアアップ(JOB@IT)