如何解决CTE、子查询、临时表或表变量之间是否存在性能差异?
sql 是一种声明性语言,而不是过程性语言。也就是说,您构造一个 sql 语句来描述您想要的结果。您没有告诉 sql 引擎 如何 完成这项工作。
作为一般规则,最好让 sql 引擎和 sql 优化器找到最佳查询计划。开发 sql 引擎需要花费很多人年的努力,所以让工程师去做他们知道该怎么做的事情。
当然,也有查询计划不是最优的情况。然后你想使用查询提示、重组查询、更新统计信息、使用临时表、添加索引等等以获得更好的性能。
至于你的问题。CTE 和子查询的性能理论上应该是相同的,因为它们都向查询优化器提供相同的信息。一个不同之处在于,使用不止一次的 CTE 可以很容易地识别和计算一次。然后可以多次存储和读取结果。不幸的是,sql Server 似乎没有利用这种基本的优化方法(您可以将这种常见的子查询消除称为消除)。
临时表是另一回事,因为您提供了有关如何运行查询的更多指导。一个主要区别是优化器可以使用临时表中的统计信息来建立其查询计划。这可以带来性能提升。此外,如果您有一个多次使用的复杂 CTE(子查询),则将其存储在临时表中通常会提高性能。查询只执行一次。
您的问题的答案是您需要尝试获得您期望的性能,特别是对于定期运行的复杂查询。在理想情况下,查询优化器会找到完美的执行路径。尽管它经常这样做,但您也许能够找到一种获得更好性能的方法。
解决方法
在这个优秀的SO questionCTE
中,讨论了和之间sub-queries
的差异。
我想具体问一下:
在什么情况下,以下每种情况更有效/更快?
- CTE
- 子查询
- 临时表
- 表变量
传统上,我temp tables
在开发中使用了很多stored procedures
——因为它们看起来比许多相互交织的子查询更具可读性。
Non-recursive CTE
s
很好地封装了数据集,并且可读性很好,但是在特定情况下可以说它们总是会表现得更好吗?还是必须总是摆弄不同的选项才能找到最有效的解决方案?
编辑
最近有人告诉我,就效率而言,临时表是一个不错的首选,因为它们具有相关的直方图,即统计信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。