我有一个表,列表分区在两列上,按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提示并不熟悉,之前找不到具体问题。
答案 0 :(得分:2)
该查询计划表明它正在追踪my_partitioned_table
的一个(或多个)分区。所以分区修剪已经发生了。
当您发布解释计划时,您已经切断了列标题(获得固定宽度版本也会有所帮助)。但最后两列几乎肯定是开始和结束分区。当您看到KEY
的开始或结束分区时,这意味着Oracle正在确定它在运行时实际需要扫描的分区集。在这种情况下,它需要确定子查询将返回的my_id
值集合,然后才能确定需要访问表中的哪些分区。 TABLE ACCESS FULL
位仅表示它将对需要访问的分区进行全面扫描。