【发布时间】:2013-05-21 23:36:37
【问题描述】:
这是一个关于 SQL Server 2008 R2 的问题
到目前为止,我还不是 DBA。我是一名java开发人员,时不时要写SQL。 (主要嵌入在代码中)。我想知道我是否在这里做错了什么,如果是,我能做些什么来避免它再次发生。
第一季度:
SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
第一季度有 14 个连接
Q2 与 Q1 相同,但有一个例外。 (SELECT * FROM T1 WHERE condition1) 之前执行,并存储在临时表中。
这不是相关的子查询。
第二季度:
SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable JOIN ...
再次,14 个连接。
现在让我感到困惑的是,Q1 花了 > 2 分钟,(尝试了几次,以避免缓存发挥作用)而 Q2(两个查询相结合)花了 2 秒!!!什么给了?
【问题讨论】:
-
我的猜测是
SELECT * FROM T1 WHERE condition1的估计行数非常不准确。将其具体化为#tempTable意味着 SQL Server 确切知道将返回多少行。你能发布两个实际执行计划的 XML 版本吗?
标签: sql sql-server-2008-r2 subquery query-performance temp-tables