1

MY_ID (値が 1,2,3,5,8...1100 の整数)、RUN_DATE (過去数日) の順序で 2 つの列にリスト パーティションを含むテーブルがあります。

私のクエリは

select * from my_partitioned_table 
where run_date = '10-sep-2014' 
and my_id in (select my_id from mapping_table where category = 1)
;

以下の EXPLAIN PLAN を使用して、完全なテーブル スキャンを実行します。

PX RECEIVE      115K    4M  600     1,01    PCWP            
PX SEND BROADCAST   :TQ10000    115K    4M  600     1,00    P->P    BROADCAST       
PX BLOCK ITERATOR       115K    4M  600     1,00    PCWC            
TABLE ACCESS FULL   MAPPING_TABLE   115K    4M  600     1,00    PCWP    
PX BLOCK ITERATOR       1G  412G    34849   1,01    PCWC        1   16
TABLE ACCESS FULL   MY_PARTITIONED_TABLE    1G  412G    34849   1,01    PCWP        KEY     KEY 

テーブル全体をスキャンするのではなく、特定のパーティションのみにアクセスするように強制するにはどうすればよいですか?

申し訳ありませんが、私はOracleのヒントに慣れていないため、以前は特定の質問を見つけることができませんでした.

4

1 に答える 1

2

そのクエリ プランは、 の 1 つ (または複数) のパーティションを対象としていることを示していますmy_partitioned_table。したがって、パーティションのプルーニングはすでに行われています。

説明プランを投稿したときに、列ヘッダーを切り取っています (固定幅バージョンを取得することも役立ちます)。しかし、最後の 2 つの列はほぼ確実に開始パーティションと終了パーティションです。開始パーティションまたは終了パーティションが表示KEYされている場合は、実行時に実際にスキャンする必要があるパーティションのセットを Oracle が決定していることを意味します。この場合、my_idテーブルのどのパーティションにアクセスする必要があるかを判断する前に、サブクエリが返す値のセットを判断する必要があります。このTABLE ACCESS FULLビットは、アクセスする必要があるパーティションのフル スキャンを実行することを示しているだけです。

于 2014-09-25T15:07:27.500 に答える