嵌套比临时表慢很多,什么原因

lint1991 2016-07-20 03:07:05
今天查询数据,发现嵌套比临时表慢很多,形式大概就是下面显示的样子
代码一:
select *
from (select *
from table
)a
where a=1

代码二:
select * into #table
from table

select *
from #table
where a=1
代码二一秒就出来了,代码一转了十几分钟还出不来,是什么原因
...全文
241 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2016-07-21
  • 打赏
  • 举报
回复
一般不会有这种情况。 如果你写的语句比较复杂,倒是有可能出现这种情况。 我们公司以前写代码都是用cte,一次写一堆,至少100-1000行,代码比较复杂,当数据量不断增长的情况下,速度越来越慢,甚至在单表数据只有1w的情况下,由于语句长达1000行,要10多分钟才能出来。 后来,采用的办法就是把语句拆分成多个,每个语句把结果放到临时表,最后关联临时表,速度就快多了,至少是稳定多了,不会时快时慢。 之所以出现这种情况,本质的原因就是 当sql语句复杂到一定程度后,sql server的优化器不能很好的优化这个sql,导致产生了较差的执行计划
造物主在胃中 2016-07-21
  • 打赏
  • 举报
回复
为什么我写的嵌套经常非常的复杂,但是每次效率都会比临时表更好
zbdzjx 2016-07-21
  • 打赏
  • 举报
回复
之前写过几次超复杂的SQL,就遇到这种情况。 查询比较慢,就将其中几部分生成临时表,再对临时表增加索引,最终拼出结果。速度最快能快几十倍。
kingtiy 2016-07-21
  • 打赏
  • 举报
回复
select * from (select * from table )a where a=1 option(recomplie) --增加这个选项试下,也就是重编译下
Ginnnnnnnn 2016-07-21
  • 打赏
  • 举报
回复
select * from (select * from table )a where a=1 改写成 select * from (select * from table where a = 1 )a 试下
唐诗三百首 2016-07-20
  • 打赏
  • 举报
回复
如果代码写法过于复杂, 可能无法产生最优执行计划. 代码二中做了拆分,降低代码复杂度,对执行计划产生有帮助.. 也可能是锁争引起的阻塞,等待锁释放的时间过长.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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