Sql server 性能差异的原因是什么?

Sql server 性能差异的原因是什么?,sql-server,tsql,Sql Server,Tsql,我正在创建一个报告,为此我编写了两种不同类型的查询。但我发现这两种方法在性能上存在巨大差异。原因可能是什么?我的主表(假设表A)包含一个日期列。我正在根据日期过滤数据。大约10张桌子我要用这张桌子 第一种方法: select A.id,A1.name,... from table A join A1 join A2 ....A10 where A.Cdate >= @date and A.Cdate <= @date 选择A.id,A1.name,。。。 从表A 加入A1 加入A2

我正在创建一个报告,为此我编写了两种不同类型的查询。但我发现这两种方法在性能上存在巨大差异。原因可能是什么?我的主表(假设表A)包含一个日期列。我正在根据日期过滤数据。大约10张桌子我要用这张桌子

第一种方法:

select A.id,A1.name,...
from table A
join A1
join A2 ....A10
where A.Cdate >= @date
and A.Cdate <= @date
选择A.id,A1.name,。。。
从表A
加入A1
加入A2…A10
其中A.Cdate>=@date

而A.Cdate=@date和A.CdateCTE基本上用于处理更复杂的代码(无论是递归的还是有子查询的),但是您需要检查关于改进两个不同查询的执行计划。 您可以通过以下网址查看CTE的使用情况:

请注意,在许多情况下,临时表的性能也比CTE好,因此您也应该尝试使用临时表。

参考资料:

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

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

因此,在你发布任何问题之前,你应该检查一下这些计数器,我相信它们在大多数情况下都会提供一些答案


CTE是用来管理代码的,它不会自动提高查询的性能。CTE将由optimizer进行扩展,因此在您的情况下,这两个表在转换或扩展后应具有相同的查询,因此具有类似的计划。

您能告诉我这是怎么回事吗?尽管我在下文中写道,临时表比CTE产生更好的结果。你能告诉我我漏掉了什么吗?你的第一句话似乎保证了CTE总是比JOIN快。我不会在评论中提供反例,但我不会做出这样的承诺,因为我知道事实并非总是如此。(也不知道你为什么在这个场景中提到“递归”——似乎不相关。)我在帖子中的意思是,cte比在递归场景中加入更好,如果我错了,请纠正我。同样,这不是普遍正确的,我不知道我们为什么要谈论递归。问题中存在什么递归查询?是的,Aaron,在这个查询中没有递归,我做了一个概括的陈述。所以我只是好奇我的知识和发展,为什么在递归场景中join比cte更快?应该,是的,但不要。否则这里就不会有问题了。不,我见过有人说两个查询很相似,但其中一个表现很差。我认为除非其他人知道这个查询和ddl等,否则他们不能对性能说任何话。因此,我希望人们先看看自己(这将有助于他们学习)然后,如果他们提出问题,他们应该包括所有这些,如果可能的话,以提供一个具体的答案,而不是一个一般的或视情况而定的答案。实际上,由于某种原因,我没有查看执行计划的权限。@NikRED您负责调整查询,而您不能查看执行计划?那么你的老板(或控制你权限的人)就做错了。而且,如果不看计划,一切都只是猜测。只是出于好奇,两个查询是否都返回了完全相同的数据?
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