2014-09-25 97 views
1

我有一个表的列表分区两列MY_ID(整数值1,2,3,5,8 ... 1100),RUN_DATE(过去几天)的顺序。Oracle强制分区修剪在条件

我的查询是

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提示并不陌生,以前找不到具体问题。

+1

请向我们展示表格的结构,请 – zaratustra 2014-09-25 13:11:56

回答

2

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

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

+0

在执行查询后,是否可以准确知道实际扫描了哪些分区?感谢您的快速回答。 – androboy 2014-09-25 16:06:11

+0

@androboy - 我不知道有一种方法可以将信息从我的脑海中取出,尽管如果您追踪执行,几乎可以肯定地从跟踪文件中推断出它。根据您的环境,您还可以通过查看会话正在进行的读取次数以及对各个分段进行的读取次数进行扣除。 – 2014-09-25 17:05:45