sql server 性能问题总结
1:刚刚看了sqlServer性能优化的书,公司席哥有正好开会总结这个问题,我把会议记录和读书内容大体结合提炼一下大家分享
2、in 和exists:
查询很慢,可以看到用了16s,看了一下执行计划:哈希匹配占消耗的的71%,由于in是hash匹配的,我猜是以为它,我把它改成exists了:
...where exists (select MAX(orderdate) from... 然后秒出了
--in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
3、当我还在纠结用于in慢 还是exists错误时,我发现了新大陆:partition
by 与ROW_NUMBER()函数,超乎我的想象在上边问题2中关联如下:select id,pharmacyId,matId,purPrice from t_purchaseitem
where pharmacyId=2950 and id in (select MAX(id) from t_purchaseitem where pharmacyId=2950 group by matId)
慢的要死,可是我把in改成exists方式时又不能过滤MAX(ID),此时霞姐给了我启发,把上边的sql改为:
select pharmacyId,matId,purPrice from(
select ROW_NUMBER() over(partition by matId order by id desc) num,id, pharmacyId,matId,purPrice from t_purchaseitem where pharmacyId=2950) aa where num=1
虽然sql变长了,可是查询速度从39秒变成了秒出,用exists还要4秒那。相比较来说简直神速呀。简单的介绍:ROW_NUMBER() OVER (ORDER BY pubtime desc) AS RowNumber其实就是根据pubtime的大小排序,然后将RowNumber标上行号。一般此方法多用与高效率分页
两个函数详细介绍看我转载的文章:SQL Server数据库partition by 与ROW_NUMBER()函数使用详解
》》》》》持续更新中》》》》》》