语句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秒
------解决方案--------------------
确实是的,索引的基本原理:
1.就是前缀性,其实就是字段的顺序,查询中的where 条件字段,要放到前面。
2.就是选择性,也就是能过滤掉大部分数据的字段,尽可能放到前面
------解决方案--------------------
基本上 也就是这种办法了,max的效率还是可以的
------解决方案--------------------
我觉得是第一个走的索引不合理。
如果有个
索引是 ([C_ID],[CSN_UpdateTime])
应该就不会有执行计划中嵌套循环的部分了。
------解决方案--------------------
最简单的方法就是重编译,不过要看你的语句频率,如果频繁编译,对CPU的开销也很高,参数嗅探你去搜一下吧,我也没有官方定义,怕没有解析清楚。plan guide这些网上也有,没必要贴给你
------解决方案--------------------
1. 如果我要取一组数据中的最大值(最新值) 用什么方式比较好?
2. 针对语句B , 我弄一个缓存表 , 来专门放 C_ID 对应的 最大值(最新值), 效率上值得吗?
1,一般情况下取max, 当然具体情况具体分析, 上面说过了。
2,看c_id重复率或者单个C_ID对应的记录数, 重复率越高,可行性越大。 重复率越低(极限情况就是一个唯一,当然你的现实中可能性不大,只是举例子),因为串连操作,可能得不尝失。
总之数据库优化(特指查询优化)就是, 没有教条, 没有哪个是绝对对的或者绝对高效的, 都只是在特定场合和条件下相对的。