新增分区+导入统计信息导致的问题

最近出了一个问题,由于新增分区后,导入了表上一个分区的统计信息做为新分区的统计信息,一条SQL走错了。类似如下的查询select * from a where b=1 and c>sysdate-7。由于c列是个日期型。导入的统计信息记录的最大值比当前日期小了快一个月,因此ORACLE评估出来的sysdate-7的数据量就特别小。因此导致本该走b列的索引走了c列。

如下方式,可以把拷贝统计信息,修改列的最大值最小值都一起实现。本例中只是修改了一个列的最大值最小值。

DECLARE
  srec      DBMS_STATS.STATREC;
  v_distcnt NUMBER;
  v_density NUMBER;
  v_nullcnt NUMBER;
  v_avgclen NUMBER;
  datevals  DBMS_STATS.DATEARRAY;
begin
  dbms_stats.copy_table_stats(ownname     => 'EVE',-----------------------拷贝统计信息
                              tabname     => 'sss',
                              srcpartname => 'P201111',
                              dstpartname => 'SYS_P310');
  DBMS_STATS.get_column_stats(ownname  => 'EVE',--------------------------获得字段的统计信息
                              tabname  => 'sss',
                              partname => 'P201111',
                              colname  => 'GMT_CREATED',
                              distcnt  => v_distcnt,
                              density  => v_density,
                              nullcnt  => v_nullcnt,
                              srec     => srec,
                              avgclen  => v_avgclen);
  datevals := DBMS_STATS.datearray(to_date('2011-01-01', 'yyyy-mm-dd'),--------------最大值,最小值
                                   to_date('2011-01-01', 'yyyy-mm-dd'));
  dbms_stats.prepare_column_values(srec, datevals);
  DBMS_STATS.set_column_stats(ownname  => 'EVE',-------------------------修改字段的统计信息,包括最大值
                              tabname  => 'sss',
                              partname => 'SYS_P310',
                              colname  => 'GMT_CREATED',
                              distcnt  => v_distcnt,
                              density  => v_density,
                              nullcnt  => v_nullcnt,
                              srec     => srec,
                              avgclen  => v_avgclen);

  COMMIT;
END;
/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-703271/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22034023/viewspace-703271/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值