【发布时间】:2012-06-25 12:58:33
【问题描述】:
在这个出色的SO question 中,讨论了CTE 和sub-queries 之间的区别。
我想特别问一下:
以下哪种情况下更高效/更快?
- CTE
- 子查询
- 临时表
- 表变量
传统上,我在开发 stored procedures 时使用了很多 temp tables - 因为它们似乎比许多相互交织的子查询更具可读性。
Non-recursive CTEs 很好地封装了一组数据,并且可读性很好,但是在某些特定情况下可以说它们总是会表现得更好吗?还是必须总是摆弄不同的选项才能找到最有效的解决方案?
编辑
最近有人告诉我,就效率而言,临时表是一个不错的首选,因为它们具有关联的直方图,即统计信息。
【问题讨论】:
-
一般性回答:视情况而定。 这取决于许多因素,任何一般性陈述都可能是错误的 - 在某些情况下。基本上:您需要测试和测量 - 看看哪个最适合您!
-
@marc_s - 好的;也许这个问题应该因为主观而被关闭?请注意,很多关于 SO 的 SQL 问题都可能被认为是主观的。
-
它可能会因为过于宽泛而被关闭 - 我同意你的观点 - SQL 中的许多事情和主题确实会得到取决于的答案。有时可以列出两个或三个标准来做出决定,但是对于您的问题,几乎不可能给出合理的建议-这取决于很多-您的表结构,这些表中的数据,您正在使用的查询,您的索引策略等等......
-
@marc_s 尝试并保留会很好 - 关于可能对 OP 进行编辑以使其更具体和更窄的任何建议?
-
请注意这个问题是特定于 SQL Server 的。对于 postgres 等其他数据库,CTE 通常比等效子查询慢得多(请参阅http://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/)
标签: sql sql-server tsql subquery common-table-expression