CTE
(Common Table Expression) vs Temp tables
or Table variables
,哪个更快?
3 回答
正如我在评论中已经说过的:这取决于!
它确实取决于您的查询、您的数据(有多少?它是什么类型的??)等等。
但是,要记住一些要点:
CTE 是仅对下一条语句有效的“内联视图”;如果可能,SQL Server 将在内存中保留一个临时结果
临时表有两种形式:仅对您的连接可见 (
create table #temp
),或者对所有连接全局可见 (create table ##temp
);当没有连接不再使用它们时,两者都将自动删除。您可以在临时表上定义索引,它们是事务的一部分表变量不允许您在它们上创建索引,它们也不会参与事务舞蹈 - 这可能是有利的或不利的 - 请注意它!A
ROLLBACK
对表变量中包含的数据没有影响....
http://royalarun.blogspot.in/2013/10/difference-between-cte-and-temp-table.html
SQL Server 中 CTE 与 Temp 表和表变量的区别
临时表是在 Tempdb 数据库中物理创建的。这些表充当普通表,也可以像普通表一样具有约束、索引。它分为两个本地临时表和全局临时表,本地临时表仅对创建表的 SQL Server 会话或连接(即单个用户)可用。全局临时表可用于所有 SQL Server 会话或连接(意味着所有用户)。这些可以由任何 SQL Server 连接用户创建,并且在所有 SQL Server 连接关闭时自动删除。在需要事务回滚支持的情况下。
CTE - 公共表表达式是一个命名的临时结果集,用于操作复杂的子查询数据。这存在于声明的范围内。这是在内存而不是 Tempdb 数据库中创建的。您不能在 CTE 上创建任何索引。
表变量就像一个变量,存在于特定批次的查询执行中。一旦它从批次中出来,它就会自动被丢弃。这也是在 Tempdb 数据库中创建的,但不是在内存中创建的。您不能在表变量上创建非聚集索引,除非该索引是表上的 PRIMARY KEY 或 UNIQUE 约束的副作用。如果结果集很小,则表变量始终是最佳选择。
在一个特定情况下,我们将迁移到 CTE 的速度提高了 50%,因此值得一试,但任何与性能相关的增强都需要进行基准测试,以便您可以相互比较。
PS:在得到我们现在使用的那个之前,我们写了不止一个带有 CTE 的查询。