2010-11-24 4 views
2

VIEW1は次のとおりです。ビューにUNION ALLが含まれている場合、Oracleにインデックスを使用させるにはどうすればよいですか?

SELECT A, B, C FROM view2 
UNION ALL 
SELECT A, B, C FROM view3 
    INNER JOIN TBL5 ON view3.CODE = TBL5.CODE 

列Cは、ソーステーブルにインデックスを付け、そして私はselect文のいずれかを実行すると、個別に、インデックスを使用し、バックフラッシュできています。ビューを使用するとタイムアウトします。私は、Oracleがビューに対してクエリを書き直し、を実行してから事実の後に述語を適用するのではなく、有用な場合にインデックスを使用したという印象を受けました。

私は間違っていますか?上のサンプルビューは問題を明らかにしますが、実際のビューはそれぞれ数十のテーブルに加わり、ビューが本当に必要です。

+0

"CODE"列はインデックス列ですか?あなたは "列C"と言う。 P.S. http://sctom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:625452100346586215 – Tim

+0

@Tim:はい、コードには索引もあります。 view2、view3とこのUNION ALLの2番目の部分はすべて最適化され、クエリとうまく機能しますが、このビュー自体を照会すると事態が悪化します。 –

+1

本当に役に立つアドバイスを提供するために、このクエリの実行計画と、別々に実行される2つの部分の実行計画を確認する必要があると思います。 –

答えて

2

オプティマイザは、ビューに対して実行プランが作成される前に、CODEの値がどれくらい前になるかを知りません。 11gの場合は、PUSH_PREDオプティマイザ・ヒントを使用して期待どおりに動作させることができます。

0

ヒントを試すことができます。 またはテーブルが分析されていることを確認してください。

他にも1つ考えられました - おそらくMeterialized Viewを作成しますか?

関連する問題