性能差异的原因是什么?

时间:2012-07-21 14:26:26

标签: sql-server tsql

我正在创建一个报告,因为我已经编写了2种不同类型的查询。但我发现这两种方法之间存在巨大的性能差异。可能是什么原因?我的主表(假设表A)包含一个日期列。我正在根据日期过滤数据。大约10个表连接我和这个表有关。

第一种方法:

select A.id,A1.name,...
from table A
join A1
join A2 ....A10
where A.Cdate >= @date
and A.Cdate <= @date

第二种方法:

With CTE as(select A.id from A where A.Cdate>=@date and A.Cdate<=@date)
select CTE.id, A1.name,.... from CTE join A1 join A2....A10

这里第二种方法很快。是什么原因?在第一种方法中,A的过滤数据只会与其他表数据连接吗?

3 个答案:

答案 0 :(得分:1)

执行计划肯定会告诉我们,但是如果CTE能够在连接之前过滤掉很多行,则可能选择了更优化的连接方法(例如合并而不是哈希)。 SQL不是假设以这种方式工作 - 理论上这两者应该以相同的方式执行。但实际上我们发现SQL Server的优化器并不完美,可以根据各种因素以不同的方式发挥作用,包括统计,选择性,并行性,缓存中该计划的预先存在的版本等等。

答案 1 :(得分:1)

一个建议。你应该能够自己回答这个问题,因为你有这两个计划。你比较了这两个计划吗?那些相似吗?此外,当性能不好时,您的意思是,时间或CPU时间或IO或您比较的是什么?

因此,在您发布任何问题之前,您应该检查这些计数器,我相信他们会在大多数情况下提供某种答案。

CTE用于管理代码,它不会自动提高查询性能。 CTE将由优化器扩展,因此在您的情况下,这两者在转换或扩展后应该具有相同的查询,因此类似的计划。

答案 2 :(得分:0)

CTE基本上用于处理更复杂的代码(无论是递归还是具有子查询),但您需要检查有关2个不同查询的改进的执行计划。 您可以在http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

检查CTE的使用情况

请注意,在许多情况下,临时表也提供了比CTE更好的性能,所以你也应该试试临时表。
参考:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb