【问题标题】:oracle force partition pruning with in condition在条件下进行 oracle 强制分区修剪
【发布时间】:2014-09-25 12:59:33
【问题描述】:

我有一个表,其两列上的分区列表按 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 提示不太熟悉,之前找不到具体问题。

【问题讨论】:

  • 请给我们看一下表格的结构

标签: sql oracle partitioning pruning


【解决方案1】:

该查询计划表明它正在处理my_partitioned_table 的一个(或多个)分区。所以分区修剪已经开始了。

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

【讨论】:

  • 在执行查询后是否可以准确地知道哪些分区被实际扫描?感谢您的快速回答。
  • @androboy - 我不知道有什么方法可以让这些信息脱离我的脑海,尽管如果你跟踪执行,你几乎可以肯定地从跟踪文件中推断出来。根据您的环境,您还可以通过观察会话正在执行的读取次数以及已对各个段执行的读取次数进行一些推断。
猜你喜欢
  • 2017-11-01
  • 2011-01-18
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多