2017-01-29 12 views
1

私は数百万のレコードを持つファクトテーブルを持っています。この表は、日付列にレンジ・パーティション化されています。私は、パーティション・プルーニングが起こる参照日付をハードコーディングすることによって、このクエリを実行するとOracleパーティションのプルーニングが発生しない

FACT_AUM (ACCOUNT_ID VARCHAR2(30),MARKET_VALUE NUMBER(20,6), POSTING_DATE DATE); 

は、私は別の一時テーブル

ACCOUNT_TMP (ACCOUNT_ID VARCHAR2(30), POSTING_DATE DATE); 

を持っていると私は実行したときの結果はすぐに戻っ

SELECT A.ACCOUNT_ID, SUM(A.MARKET_VALUE) FROM 
FACT_AUM A JOIN ACCOUNT_TMP B ON A.ACCOUNT_ID = B.ACCOUNT_ID 
AND A.POSTING_DATE=TO_DATE('30-DEC-2016',DD-MON-YYYY') GROUP BY 
A.ACCOUNT_ID; 

来ます次は、パーティションのプルーニングが表示されず、クエリが回転し続けます。

SELECT A.ACCOUNT_ID, SUM(A.MARKET_VALUE) FROM 
FACT_AUM A JOIN ACCOUNT_TMP B ON A.ACCOUNT_ID = B.ACCOUNT_ID 
AND A.POSTING_DATE = B.POSTING_DATE GROUP BY 
A.ACCOUNT_ID; 

これについての洞察は役に立ちます。

+0

このフォーラムでDDLを共有できるかどうかわかりません。要約版を入手してDDLに関連する部分を投稿できるかどうかを確認します。 – sk411

+0

これらの2つのクエリの実行計画は、さらに調査する方が良いでしょう。 – JSapkota

+0

両方のクエリの実行計画を確認しました。ハードコードされた日付を持つものはフィルタ述語にposting_dateを持ち、partition_start&partition_stopには特定のパーティションIDがあります。しかし、結合演算との一方が(表146のパーティションを有するもの) – sk411

答えて

0

Oracleは値をハードコーディングしている間にパーティションのプルーニングを使用しました。なぜなら、Oracleはパーティションのプルーニングを行う利点があると感じていたからです。

ファクト・テーブルを一時表と結合すると、ステージングにリワードする表が作成されますが、オラクルは答えを計算するためにどのパーティションにヒットする必要があるかを推測できません。オラクルは、ステージング・テーブルで使用可能な値の範囲を評価します。

しかし、関係するテーブルの統計情報を提供しない限り、テーブルの順序付けとテーブル結合のより重要なトピックには関与できませんでした。クイックフィックスを行うには、Orderヒントまたはネストループヒントを使用します。

関連する問題