oracle 9i
车辆信息表clxx ,数据几百万
其中两个字段:车牌号码(cphm varchar2(10)), 车辆类型(cllx char(2))
建了组合索引(cphm, cllx)
select cphm, count(*) from clxx where cphm>' ' group by cphm;
select cllx, count(*) from clxx where cphm>' ' group by cllx;
两句时间接近,都是3s多些
第一句的逻辑基本清楚,cllx没有用到但第二句为什么也能这么快-------第一问索引改成(cllx, cphm)理论上是不是更好(上述两句group by的效率)--------第二问

解决方案 »

  1.   

    像这样的组合索引INDEX(cllx, cphm),CLLX被叫做引导列,只有引导列被用到,这个组合索引才会起作用,否则无效!
      

  2.   

    select cllx, count(*) from clxx where cphm>' ' group by cllx;
    这句,你用到了引导列
      

  3.   

    现有索引(cphm, cllx) ,条件cphm>' ' ,索引肯定用上了
    两句sql执行计划一样,都是index range scan ,没有其他特殊的车辆类型肯定是相同的多,车牌号码肯定是相同的少
    group by cllx时,如果按照index(cphm, cllx)的先后次序,应该很慢,类似full table scan所以怀疑oracle对于组合索引是不是有什么特殊处理
      

  4.   

     Oracle 要使用一个索引,有一些最基本的条件:  1, where 子句中的这个字段,必须是复合索引的第一个字段;  2, where 子句中的这个字段,不应该参与任何形式的计算  具体来讲,假设一个索引是按 f1, f2, f3的次序建立的,现在有一个 sql 语句, where 子句是 f2 = : var2, 则因为 f2 不是索引的第1个字段,无法使用该索引。
    至于GROUP哪个字段,和用不用索引无关
      

  5.   

    这个应该是一样的啊!
    你的WHERE 条件里用的都是CPHM这个字段!这个字段是联合索引的引导列,所以两个查询语句都用到了该联合索引!
    而且两个语句返回的结果集都是达到总查询量的15%以上,所以查询速度相当也没有啥问题啊!
      

  6.   

    呵呵,我感觉没有偏题呀~
    我只是想说明,你只要再WHERE后面用到了组合索引的引导列就可以,GROUP哪个字段貌似没有关系
      

  7.   

    算是思考角度不同吧,简化一下问题:
    组合索引a,b两字段, 确定是用了索引
    感觉索引应该是类似这种方式:
    ┬a1┬b1
    │  └b2
    ├a2┬b1
    │  ├b2
    │  └b3
    └a3┬b1
        ├b2
        ├b3
        └b4
    而a几乎都不一样,b只有十几个不同的值
    这样的话where a>' ' and b='01'虽然用上索引,但也应该是很慢
      

  8.   

    那你2条语句执行计划的COST的值一样吗?
    要是一样的话,组合索引可能不是你想的那样
      

  9.   

    学习我觉得,cplx、cphm顺序的索引会更有效。
    对于你的这张表,我认为创建cplx、cphm组合索引之外,还要建立cphm的单独索引。
      

  10.   

    哪位高手分析一下
    select cllx, count(*) from clxx where cphm>' ' group by cllx;
    组合索引的执行原理
      

  11.   

    对于你的二个sql,都用到了where cphm>' ' ,都用到了索引,
    至于速度为什么会快,你最好是在不同的会话,多次执行取平均值
      

  12.   

    oracle 9i以后有组合索引有跳跃式扫描查询,所以那个字段在前在后无所谓。
      

  13.   

    终于有人提到跳跃式索引扫描了我的疑问也是这个,按理说值比较少的字段cllx在前面,很正常
    可是现在是反的,cphm在前面
      

  14.   


    学到新的东西
    可是我在oracle 9i的版本上实际开发并没有跳跃式扫描查询