• sql优化-hint的作用


        目前,oracle采用的是CBR优化器,所以在有些时候,机器会按照自己的意愿去执行sql,当然oracle是根据本身的一些信息来做决定的,比如:统计信息。但有些时候,机器并不一定会按照我们预想的那样去执行。

        今天就遇到这样的一个问题,在查看某一段时间内的出运明细时,执行时间较长。sql如下:

    select *
      from C1.T_DECLAREDETAIL t1
     where t1.commitdate >= to_date('2013-01-01', 'YYYY-MM-DD')
       and t1.commitdate < to_date('2013-06-30', 'YYYY-MM-DD') + 1


        通过查看执行计划,发现进行了全表扫描。因为commitdate字段上有索引,我本以为会走索引的。

    执行计划

        很明显,是做了全表扫描。

        做了个实验,如果用commitdate等于某一个日期的话,会走索引。通过这个实验,我怀疑是因为oracle自作主张的认为这段时间里的数据量占整个数据量的10%以上,选择性不高,所以做了全盘扫描。为了验证我的假设,我把范围进行了缩小,结果发现很明显的走了索引:


        测试到这里,我也没有更好的办法了,只好给脚本加上hint了。在一般情况下,最好是不要通过hint来处理。修改后的脚本如下:

    select /*+ INDEX (t1 IND_T_DECLAREDETAIL_COMMIT)*/ *
      from C1.T_DECLAREDETAIL t1
     where t1.commitdate >= to_date('2013-01-01', 'YYYY-MM-DD')
       and t1.commitdate < to_date('2013-06-30', 'YYYY-MM-DD') + 1


        执行计划如下:


        从执行计划里能看出,这个脚本是走了执行计划的。而且实践也证明,这下修改后,执行时间也确实缩短了。

  • 相关阅读:
    HSV 武胜
    crystalReportViewer+ReceiveCrystalReport.rpt+DataSet.xsd做报表 转 武胜
    Apache Gzip设置
    Linux gsoap 访问Jira
    搜索引擎Senna
    c 条件编译 ifndef解决 gcc multiple define error.
    搜索引擎 apachesolr
    Lucene:基于Java的全文检索引擎简介
    搜索引擎Zend_lucene
    基于应用程序级的Apache认证配置(普通认证篇)
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3181721.html
Copyright © 2020-2023  润新知