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

2个语句的执行效率问题
语句A

select  top 1 *   from  CarVehicleData_tbl where c_id =80   order by  [CSN_UpdateTime] desc


语句B

select  *   from  CarVehicleData_tbl where [CSN_ID] in ( select max([CSN_ID])
from      CarVehicleData_tbl c
where C_ID=80
group by [CSN_Part],[CSN_Type])

C_ID CSN_UpdateTime   我都做了索引
但是语句A 执行要十几秒, 而语句B只要3秒

------解决方案--------------------
引用:
Quote: 引用:

如果按你这样说,就不可能存在复合索引了。

Quote: 引用:

Quote: 引用:

没必要单独弄,开销更大

我听说 索引对  查询字段的顺序要求非常严格,我担心命不中索引,所以分别建的


我看有人针对 索引字段的顺序进行测试的 帖子, 是不同的顺序有不同的效率


确实是的,索引的基本原理:

1.就是前缀性,其实就是字段的顺序,查询中的where 条件字段,要放到前面。

2.就是选择性,也就是能过滤掉大部分数据的字段,尽可能放到前面
------解决方案--------------------
基本上 也就是这种办法了,max的效率还是可以的
------解决方案--------------------
我觉得是第一个走的索引不合理。
如果有个
索引是 ([C_ID],[CSN_UpdateTime])
应该就不会有执行计划中嵌套循环的部分了。

------解决方案--------------------
最简单的方法就是重编译,不过要看你的语句频率,如果频繁编译,对CPU的开销也很高,参数嗅探你去搜一下吧,我也没有官方定义,怕没有解析清楚。plan guide这些网上也有,没必要贴给你
------解决方案--------------------
引用:
1. 如果我要取一组数据中的最大值(最新值)  用什么方式比较好?

2. 针对语句B ,  我弄一个缓存表 , 来专门放 C_ID 对应的 最大值(最新值), 效率上值得吗?


1,一般情况下取max,  当然具体情况具体分析, 上面说过了。
2,看c_id重复率或者单个C_ID对应的记录数, 重复率越高,可行性越大。 重复率越低(极限情况就是一个唯一,当然你的现实中可能性不大,只是举例子),因为串连操作,可能得不尝失。

总之数据库优化(特指查询优化)就是, 没有教条, 没有哪个是绝对对的或者绝对高效的, 都只是在特定场合和条件下相对的。