ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 新增分区+导入统计信息导致的问题

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

原创 Linux操作系统 作者:wei-xh 时间:2011-07-27 19:07:32 0 删除 编辑

最近出了一个问题,由于新增分区后,导入了表上一个分区的统计信息做为新分区的统计信息,一条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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: swapping join input
请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2341012