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的效率)--------第二问
车辆信息表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的效率)--------第二问
这句,你用到了引导列
两句sql执行计划一样,都是index range scan ,没有其他特殊的车辆类型肯定是相同的多,车牌号码肯定是相同的少
group by cllx时,如果按照index(cphm, cllx)的先后次序,应该很慢,类似full table scan所以怀疑oracle对于组合索引是不是有什么特殊处理
至于GROUP哪个字段,和用不用索引无关
你的WHERE 条件里用的都是CPHM这个字段!这个字段是联合索引的引导列,所以两个查询语句都用到了该联合索引!
而且两个语句返回的结果集都是达到总查询量的15%以上,所以查询速度相当也没有啥问题啊!
我只是想说明,你只要再WHERE后面用到了组合索引的引导列就可以,GROUP哪个字段貌似没有关系
组合索引a,b两字段, 确定是用了索引
感觉索引应该是类似这种方式:
┬a1┬b1
│ └b2
├a2┬b1
│ ├b2
│ └b3
└a3┬b1
├b2
├b3
└b4
而a几乎都不一样,b只有十几个不同的值
这样的话where a>' ' and b='01'虽然用上索引,但也应该是很慢
要是一样的话,组合索引可能不是你想的那样
对于你的这张表,我认为创建cplx、cphm组合索引之外,还要建立cphm的单独索引。
select cllx, count(*) from clxx where cphm>' ' group by cllx;
组合索引的执行原理
至于速度为什么会快,你最好是在不同的会话,多次执行取平均值
可是现在是反的,cphm在前面
学到新的东西
可是我在oracle 9i的版本上实际开发并没有跳跃式扫描查询