“select top 1”导致查询非常慢

这是我2015年4月17日的一篇网易博客,搬迁至此。

通过JUnit进行单元测试时发现JdbcTemplate执行一个sql查询语句时间居然超过4000ms,然后直接在sqlserver2014数据库中执行这个sql,运行时间依然约4s。于是把矛头对准刚才自己写的这个视图,猜想问题可能是因为关联表太多,可能是由于group by 导致,但经过各种修改,问题依旧。偶然想到去掉“top 1”再试试,居然查询时间突减到300多ms,竟然是“top 1”引起的。

问题解决了,在网上搜索出根本原因,分享给大家:

在使用TOP 1的时候,SQL Server会尽力先找出这条TOP 1的记录,这就导致它采用了与不加TOP时不一致的扫描算法,SQL Server查询优化器始终认为,应该可以比较快的找到匹配的第1条记录,所以一般是使用嵌套循环的联接,则不加TOP 1时,SQL Server会根据结构和数据的统计信息决策出联接策略。嵌套循环一般适用于联系的两个表,一个表的数据较大,而另一个表的数据较小的情况,如果查询匹配的值出现在扫描的前端,则在取TOP 1的情况下,是符合嵌套循环联系的使用条件的,但当匹配的数据出现在扫描的后端,或者是基本上没有匹配的数据时,则嵌套循环要扫描完成两个大表,这显然是不适宜的,也正是因为这种情况,导致了TOP 1比不加TOP 1的效率慢很多。

你可能感兴趣的:(数据库相关)