日期:2014-05-17  浏览次数:21471 次

关于oracle组合索引的group by
oracle 9i
车辆信息表clxx ,数据几百万
其中两个字段:车牌号码(cphm varchar2(10)), 车辆类型(cllx char(2))
建了组合索引(cphm, cllx)
SQL code
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的效率)--------第二问

------解决方案--------------------
像这样的组合索引INDEX(cllx, cphm),CLLX被叫做引导列,只有引导列被用到,这个组合索引才会起作用,否则无效!
------解决方案--------------------
这个应该是一样的啊!
你的WHERE 条件里用的都是CPHM这个字段!这个字段是联合索引的引导列,所以两个查询语句都用到了该联合索引!
而且两个语句返回的结果集都是达到总查询量的15%以上,所以查询速度相当也没有啥问题啊!
------解决方案--------------------
学习

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

------解决方案--------------------
不用组合索引
 车类型相同肯定很多
------解决方案--------------------
对于你的二个sql,都用到了where cphm>' ' ,都用到了索引,
至于速度为什么会快,你最好是在不同的会话,多次执行取平均值
------解决方案--------------------
oracle 9i以后有组合索引有跳跃式扫描查询,所以那个字段在前在后无所谓。