关于oracle组合索引的group by

fosjos 2009-01-08 04:27:01
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的效率)--------第二问
...全文
2901 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
deduct 2009-02-16
  • 打赏
  • 举报
回复
貌似有点复杂???
chentony 2009-02-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wind__dance 的回复:]
oracle 9i以后有组合索引有跳跃式扫描查询,所以那个字段在前在后无所谓。
[/Quote]

学到新的东西
可是我在oracle 9i的版本上实际开发并没有跳跃式扫描查询
fosjos 2009-01-23
  • 打赏
  • 举报
回复
看来,还是过年后发新贴再问吧
Raul_Gonzalez 2009-01-22
  • 打赏
  • 举报
回复
mark!~ 关注!~
zhouguoyao 2009-01-22
  • 打赏
  • 举报
回复
关注
fosjos 2009-01-21
  • 打赏
  • 举报
回复
两句sql的执行计划完全一致
wind__dance 2009-01-20
  • 打赏
  • 举报
回复
你把执行计划贴出来吧?我怀疑你第二条记录查询的时候转化为位图索引扫描了,因为毕竟车的类型比较少。
fosjos 2009-01-19
  • 打赏
  • 举报
回复
继续期待高手...
fosjos 2009-01-16
  • 打赏
  • 举报
回复
终于有人提到跳跃式索引扫描了

我的疑问也是这个,按理说值比较少的字段cllx在前面,很正常
可是现在是反的,cphm在前面
wind__dance 2009-01-15
  • 打赏
  • 举报
回复
oracle 9i以后有组合索引有跳跃式扫描查询,所以那个字段在前在后无所谓。
chentony 2009-01-15
  • 打赏
  • 举报
回复
对于你的二个sql,都用到了where cphm>' ' ,都用到了索引,
至于速度为什么会快,你最好是在不同的会话,多次执行取平均值
fosjos 2009-01-15
  • 打赏
  • 举报
回复
继续等待高手解释......
churentoudi 2009-01-13
  • 打赏
  • 举报
回复
不用组合索引
车类型相同肯定很多
fosjos 2009-01-13
  • 打赏
  • 举报
回复
哪位高手分析一下
select cllx, count(*) from clxx where cphm>' ' group by cllx;

组合索引的执行原理
yf520gn 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fosjos 的回复:]
感谢1楼的积极讨论

但更希望不要偏题
[/Quote]
呵呵,我感觉没有偏题呀~
我只是想说明,你只要再WHERE后面用到了组合索引的引导列就可以,GROUP哪个字段貌似没有关系
rexyudl 2009-01-09
  • 打赏
  • 举报
回复
这个应该是一样的啊!
你的WHERE 条件里用的都是CPHM这个字段!这个字段是联合索引的引导列,所以两个查询语句都用到了该联合索引!
而且两个语句返回的结果集都是达到总查询量的15%以上,所以查询速度相当也没有啥问题啊!
fosjos 2009-01-09
  • 打赏
  • 举报
回复
感谢1楼的积极讨论

但更希望不要偏题
fibbery 2009-01-09
  • 打赏
  • 举报
回复
学习

我觉得,cplx、cphm顺序的索引会更有效。
对于你的这张表,我认为创建cplx、cphm组合索引之外,还要建立cphm的单独索引。
yf520gn 2009-01-09
  • 打赏
  • 举报
回复
那你2条语句执行计划的COST的值一样吗?
要是一样的话,组合索引可能不是你想的那样
fosjos 2009-01-09
  • 打赏
  • 举报
回复
算是思考角度不同吧,简化一下问题:
组合索引a,b两字段, 确定是用了索引
感觉索引应该是类似这种方式:
┬a1┬b1
│ └b2
├a2┬b1
│ ├b2
│ └b3
└a3┬b1
├b2
├b3
└b4
而a几乎都不一样,b只有十几个不同的值
这样的话where a>' ' and b='01'虽然用上索引,但也应该是很慢
加载更多回复(8)

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧