您的位置:首页 > 数据库

sql server 性能问题总结

2017-04-27 17:53 176 查看
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()函数使用详解

》》》》》持续更新中》》》》》》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: