oracle分区表全分区扫描问题

分区表:将一个大表根据某种规则分成多个小表,从而提高检索效率。

查询分区表sql

select user_tables.table_name

  from user_tables

 where user_tables.partitioned = 'YES'


通过以上命令可查询出数据库中登陆用户下的全部分区表。

查询分区表分区字段sql

select a.table_name, a.partitioned, b.partition_count, c.column_name

  from user_tables a, user_part_tables b, user_part_key_columns c

 where a.table_name = b.table_name

   and b.table_name = c.name

   and c.name = '&table_name';


通过以上命令可查询出某个分区表中的分区字段,查询条件中的表名需要大写。

知道了那些是分区表和分区字段后,就可以分析具体某个含有分区表sql的执行计划,
看执行了表的全分区扫描、还是单分区扫描,它们的执行效率相差很大,
通过cost值可以看出,下面使用事例详细介绍一下。

典型案例1:

select arc_e_cons_prc_amt.mp_name, 
arc_e_cons_snap.elec_addr
from arc_e_cons_prc_amt,
sa_org,
arc_e_cons_snap,
e_cat_prc,
sa_c_trade_type
where (arc_e_cons_prc_amt.CALC_ID = arc_e_cons_snap.CALC_ID and
arc_e_cons_prc_amt.ORG_NO = sa_org.ORG_NO and
arc_e_cons_prc_amt.PRC_CODE = e_cat_prc.PRC_CODE and
arc_e_cons_prc_amt.PARA_VN = e_cat_prc.PARA_VN and
arc_e_cons_prc_amt.TRADE_TYPE_CODE = sa_c_trade_type.TRADE_CODE)
and (arc_e_cons_prc_amt.YM >= '200809' and
arc_e_cons_prc_amt.YM <= '200811' and
arc_e_cons_prc_amt.ORG_NO = '2340203')


修改为如下sql:

select arc_e_cons_prc_amt.mp_name, 
arc_e_cons_snap.elec_addr
from arc_e_cons_prc_amt,
sa_org,
arc_e_cons_snap,
e_cat_prc,
sa_c_trade_type
where (arc_e_cons_prc_amt.CALC_ID = arc_e_cons_snap.CALC_ID and
arc_e_cons_prc_amt.ORG_NO = sa_org.ORG_NO and
arc_e_cons_prc_amt.PRC_CODE = e_cat_prc.PRC_CODE and
arc_e_cons_prc_amt.PARA_VN = e_cat_prc.PARA_VN and
arc_e_cons_prc_amt.TRADE_TYPE_CODE = sa_c_trade_type.TRADE_CODE)
and (arc_e_cons_prc_amt.YM >= '200809' and
arc_e_cons_prc_amt.YM <= '200811' and
arc_e_cons_prc_amt.ORG_NO = '2340203')
and arc_e_cons_snap.ORG_NO = arc_e_cons_prc_amt.ORG_NO


    注:上面的sql中存在两个分区表arc_e_cons_snap和arc_e_cons_prc_amt,
查询条件中要有两个表的分区字段条件。

Labels parameters    

你可能感兴趣的:(oracle,sql,C++,c,C#)