Performance CTE(公共表表达式)与临时表或表变量相比,哪个更快?

Performance CTE(公共表表达式)与临时表或表变量相比,哪个更快?,performance,sql-server-2008-r2,common-table-expression,temp-tables,table-variable,Performance,Sql Server 2008 R2,Common Table Expression,Temp Tables,Table Variable,CTE(通用表格表达式)与Temp tables或Table variables相比,哪一种更快?在一种特定情况下,我们向CTE移动的速度提高了50%,因此值得尝试一下,但任何与性能相关的增强都需要进行基准测试,以便您可以相互比较 PS:在得到我们现在使用的查询之前,我们写了不止一个带有CTE的查询。正如我在评论中所说:这取决于情况 这确实取决于你的查询、你的数据(有多少?是什么类型的???)等等 不过,要记住几个要点: CTE是仅对下一条语句有效的“内联视图”;如果可能,SQL Server

CTE
(通用表格表达式)与
Temp tables
Table variables
相比,哪一种更快?

在一种特定情况下,我们向CTE移动的速度提高了50%,因此值得尝试一下,但任何与性能相关的增强都需要进行基准测试,以便您可以相互比较


PS:在得到我们现在使用的查询之前,我们写了不止一个带有CTE的查询。

正如我在评论中所说:这取决于情况

这确实取决于你的查询、你的数据(有多少?是什么类型的???)等等

不过,要记住几个要点:

  • CTE是仅对下一条语句有效的“内联视图”;如果可能,SQL Server将在内存中保留一个临时结果

  • 临时表有两种风格:仅对连接可见的(
    createtable#Temp
    ),或对所有连接全局可见的(
    createtable#Temp
    );当不再有连接使用它们时,这两个选项都将自动删除。您可以在临时表上定义索引,它们是事务的一部分

  • 表变量不允许您在其上创建索引,也不允许它们参与事务舞蹈-这可能是赞成或反对-请注意!
    回滚
    对表变量中包含的数据没有影响

SQL Server中CTE和Temp表与表变量之间的差异

  • 临时表是在Tempdb数据库中物理创建的。这些表充当普通表,也可以具有约束,索引与普通表类似。它分为两个本地临时表和全局临时表, 本地临时表仅对创建表的SQL Server会话或连接(表示单个用户)可用。 全局临时表可用于所有SQL Server会话或连接(表示所有用户)。 这些可以由任何SQL Server连接用户创建,并且在关闭所有SQL Server连接后会自动删除。在需要事务回滚支持的情况下

  • CTE-Common table Expression是一个命名的临时结果集,用于操作复杂的子查询数据。这在语句的范围内存在。这是在内存中而不是在Tempdb数据库中创建的。不能在CTE上创建任何索引

  • 表变量的作用类似于一个变量,存在于特定的查询执行批中。一旦批量生产出来,它就会被自动丢弃。这也是在Tempdb数据库中创建的,但不是在内存中创建的。不能在表变量上创建非聚集索引,除非该索引是表上主键或唯一约束的副作用。 如果结果集很小,则表变量始终是最佳选择


  • 简单:这要看情况了这个问题没有一个单一的答案-它确实取决于您的数据(多少?什么类型?),您的CTE有多复杂。。。。。实际上,这是不可能回答的,真的……@marc_s:我目前有一个基于表变量的解决方案,我正在考虑将其更改为CTE,现有的查询有3个连接和大量基于日期的检查。所以我想如果CTE能改善什么?@System.Expection:你能给我们看看你的问题吗??再说一遍:如果不知道你到底在做什么,就不可能做出任何真正有用的评论。。。