关于 order by 导致查询慢

jestymat 2015-06-23 01:49:15

查询


select a.columns, b.columns,c.columns --columns表示多列数据,不代表列名称
from TA a
left join TB b on a.xx=b.xx
left join TC c on b.yy=c.yy
where conditions --查询条件


使用SQL Server 2008 数据库
TA 表数据量 70K +
TB表数据量 4M+
TC表数据 10K+

执行以上 SQL ,耗时 1 s ,结果集 2条数据

现在嵌套一层查询

select * , col1*col2
from (
select a.columns, b.columns,c.columns --columns表示多列数据,不代表列名称
from TA a
left join TB b on a.xx=b.xx
left join TC c on b.yy=c.yy
where conditions --查询条件
) a order by id asc


id 来自表TB,是个自增 IDENTITY字段,(TA,TB,TC表都有IDENTITY 的ID字段,但只有B.ID被SELECT出来)
整个查询条件与第一个相同,但是耗时 13 m , 2条数据

如果把 order by id asc 去掉,耗时 1 s , 2条数据





...全文
556 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
薛定谔的DBA 2015-06-30
  • 打赏
  • 举报
回复
这排序放在里面和外面都一样。既然是左连接,排序最好用TA表中的字段。如果不用,那就创建合适的索引。
zbdzjx 2015-06-30
  • 打赏
  • 举报
回复
之前有碰到过类似情况,当时懒的查原因,就将结果生成临时表,再order by,速度就快多了。
menggang9802 2015-06-29
  • 打赏
  • 举报
回复
你能不能贴出两个的执行计划,我们看看执行计划的变化情况。
jestymat 2015-06-24
  • 打赏
  • 举报
回复
引用 4 楼 xyj0808xyj 的回复:
那么大数据量排序,肯定慢啊,何不放在后台或者前台遍历一下?
你都没看清问题 如果只查询,只需要1秒 但是增加了一个排序,就变成了13分钟 问题是,这个排序不是放在查询时, 而是针对内嵌查询结束后的结果集进行排序的
0808xyj 2015-06-23
  • 打赏
  • 举报
回复
那么大数据量排序,肯定慢啊,何不放在后台或者前台遍历一下?
Tiger_Zhao 2015-06-23
  • 打赏
  • 举报
回复
查询快慢关键是索引,你要把 b.id 和 b.xx 放在一个索引中。
最好对比执行计划,靠猜是解决不了问题的。
jestymat 2015-06-23
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
记录数少(2条)不等于结果小。嵌套需要存储中间结果。
select a.columns, b.columns,c.columns   --columns表示多列数据,不代表列名称
from TA a
left join TB b on a.xx=b.xx
left join TC c on b.yy=c.yy
where conditions              --查询条件
order by b.id asc
这个方法也尝试过,执行了几分钟,没出结果就取消了 而且从网上看到,order by放在内部的效率更低 详情见 http://stackoverflow.com/questions/884661/slow-query-when-using-order-by
Tiger_Zhao 2015-06-23
  • 打赏
  • 举报
回复
记录数少(2条)不等于结果小。嵌套需要存储中间结果。
select a.columns, b.columns,c.columns   --columns表示多列数据,不代表列名称
from TA a
left join TB b on a.xx=b.xx
left join TC c on b.yy=c.yy
where conditions --查询条件
order by b.id asc

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧