0

次号のためにご協力をお願いします。本当の問題ですが、例のように提示します。

以下のように構成されたビューがあります

viewa =
sel * from
(
calendar_dim
inner join
(
sel * from table_a
inner join table_b
union all
sel * from table_c
inner join table_D
)
on...
)

すべてのテーブル、table_a table_b table_c table_d には同じ pi 列とパーティション列があり (最初のパーティション レベルは日付にあります)、統計は最新です。

私の質問は次のとおりです。

次のようなクエリを実行しようとすると

sel *
  from viewa
 where cal_Date = '2013-05-31'
-->> the explain plan works perfect. It takes only one partition from each table and produce the result.

同じことが複数の date 、 /...... where cal_Date in ('2013-05-31','','',.......) でも起こります (正しい数のパーティションが必要です)。

しかし、このビューを 10 個の異なる日付を含むテーブルと内部結合しようとすると、ビューの各テーブルから 10 個のパーティションがこのスプールを外部テーブルと内部結合するのを待っていました。

sel a.*
from viewa a
  inner join table_e b
   on a.cal_Date = b.cal_Date

ビューの各テーブルからすべてのアンプを取得してから、外部テーブルを複製します。問題は、ビュー内の 4 つのテーブルが非常に大きく、約 10 億行あることです。

これに対する解決策は?

私は、期待される明確な日付のみを含む揮発性テーブル (1 つの列 = 日付) を作成しようとしましたが、何も含まれていません。それでも同じ動作です。

4

1 に答える 1

0

実際には、「単一テーブル」条件をビューに追加すると、パーサー自体が提供された値に基づいてパーティションの削除を決定します。

sel * from viewa where cal_Date = '2013-05-31' 

「結合条件」がある場合、パーサーは他のテーブルにある値を見つける方法がないため、実行時に動的パーティションを削除することで拡張できますが、上記の場合のように静的パーティションを削除することはできません。

sel a.* from viewa a inner join table_e b on a.cal_Date = b.cal_Date 

次のフレーズが説明に含まれているかどうかを確認してください「...動的パーティションの削除によって強化された結合....」。そうでない場合は、他のテーブルと同じパーティション式で cal_date に table_e をパーティション分割してみてください。それは役立つはずです。

于 2013-06-19T05:00:56.617 に答える