Sql 条件为in的oracle强制分区修剪
我有一个表,两列上有列表分区,顺序是我的\u ID(值为1,2,3,5,8…1100的整数)、RUN\u DATE(过去几天) 我的问题是Sql 条件为in的oracle强制分区修剪,sql,oracle,partitioning,pruning,Sql,Oracle,Partitioning,Pruning,我有一个表,两列上有列表分区,顺序是我的\u ID(值为1,2,3,5,8…1100的整数)、RUN\u 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
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提示不太熟悉,以前找不到具体的问题。该查询计划表示它正在查找
我的分区表的一个(或多个)分区。所以分区修剪已经开始了
在发布解释计划时,您已经删除了列标题(获得固定宽度版本也会很有帮助)。但最后两列几乎肯定是开始和结束分区。当您看到开始分区或结束分区的KEY
时,这意味着Oracle正在确定运行时实际需要扫描的分区集。在这种情况下,它需要确定子查询将返回的my_id
值集,然后才能确定需要访问表中的哪些分区。TABLE ACCESS FULL
位仅表示它将对需要访问的分区进行完全扫描。显示表的结构,请您确切地知道在执行查询后实际扫描了哪些分区吗?谢谢你的快速回答。@androboy-我不知道有什么方法可以把这些信息从我的脑海中抹去,尽管如果你跟踪一次执行,你几乎可以肯定地从跟踪文件中推断出来。根据您的环境,您还可以通过观察会话正在执行的读取次数以及对各个段执行的读取次数来进行一些推断。