oracle数据库的emp表,用户为scott:
表中大约有1,000,000条数据库。
我执行查询:select ename from emp where deptno=10;查询时间为21.22秒然后我在dept列上增加索引idx1:同样执行select ename from emp where deptno=10;查询时间为21.18秒为使用快速全局扫描:我删掉上面建立的索引idx1,然后建立一个联合索引(在select列和where列上都建立索引,只会访问索引,而不去扫面表):create index idx2 on emp (deptno,ename);为保证查询时使用idx2索引,我加了个提示,事实上emp上就一个主键的索引
然后执行查询:select /*index_ffs(emp inx2)*/ename from emp where deptno=10;查询时间为21.09秒天哪,查询时间几乎一样,我建立的索引为什么没有用呢?????????
谁能帮我分析一下?我看的oradle性能与优化上做的实验显示,利用idx2做查询的速度最起码得快10倍!

解决方案 »

  1.   

    上面的提示我写的有点问题:应该是:select /*+index_ffs(emp EMP_IDX2) */ename from emp where deptno=10
      

  2.   

    同样执行select ename from emp where deptno=10;查询时间为21.18秒   是什么东西
      

  3.   


    楼主可以用Explain plan 分析下语句,看看执行计划里面到底走没走索引。 建了索引不一定就走, Oracle 优化器会根据STATISTIC的信息来决定用CBO还是RBO. 先把表分析下:
    analyze table tablename compute statistics for all indexes;
    看看走没走索引..SQL语句的执行计划走不走索引除了与Statistic有关系,还有pfile的一个参数有关:optimizer_index_cost_adj. 该参数影响优化器选择索引还是全表扫描的倾向,建议将其设为40. Oracle 10g Statistic数据统计
    http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668723.aspx楼主还可以试试这个强制索引:
    select /*+ index(emp inx2) */ ename from emp where deptno=10;当返回的数据集超过了整个记录的20%时,此时的建议是不要走索引,楼主这肯定没这回事了,顺便提下..
      

  4.   

    关注,建议看下执行计划.
    set autotrace on explain