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