1

我有一个表,其中两列上的分区列表按 MY_ID(值为 1、2、3、5、8...1100 的整数)、RUN_DATE(过去几天)的顺序排列。

我的查询是

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

它将进行全表扫描,并带有以下解释计划。

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

该查询计划表明它正在执行一个(或多个)分区my_partitioned_table。所以分区修剪已经发生了。

当您发布解释计划时,您已经切断了列标题(获得固定宽度版本也会有所帮助)。但最后两列几乎可以肯定是开始和结束分区。当您看到KEY开始或结束分区时,这意味着 Oracle 正在确定它在运行时实际需要扫描的分区集。在这种情况下,它需要确定my_id子查询将返回的一组值,然后才能确定需要访问表中的哪些分区。该TABLE ACCESS FULL位仅表明它将对其需要访问的分区进行全面扫描。

于 2014-09-25T15:07:27.500 回答