CTE(通用表表达式)与临时表或表变量,哪个更快?

问题描述 投票:0回答:4

CTE
(通用表表达式)与
Temp tables
Table variables
,哪个更快?

performance sql-server-2008-r2 common-table-expression temp-tables table-variable
4个回答
33
投票

正如我在评论中已经说过的:这取决于!

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

不过要记住一些要点:

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

  • 临时表有两种形式:仅对您的连接可见的 (

    create table #temp
    ),或对所有连接全局可见的 (
    create table ##temp
    );当没有连接再使用它们时,两者都会自动删除。您可以在临时表上定义索引,它们是事务的一部分

  • 表变量不允许您在它们上创建索引,它们也不会参与事务舞蹈 - 这可能是优点,也可能是缺点 - 请注意这一点!

    ROLLBACK
    对表变量中包含的数据没有影响....


16
投票

http://royalarun.blogspot.in/2013/10/difference- Between-cte-and-temp-table.html

CTE 与 SQL Server 中的临时表和表变量之间的区别

  1. 临时表是在 Tempdb 数据库中物理创建的。这些表充当普通表,并且也可以像普通表一样具有约束、索引。分为Local临时表和Global临时表两个, 本地临时表仅适用于创建该表的 SQL Server 会话或连接(意味着单个用户)。 全局临时表可供所有 SQL Server 会话或连接(指所有用户)使用。 这些可以由任何 SQL Server 连接用户创建,当所有 SQL Server 连接关闭时,它们会自动删除。您需要事务回滚支持的情况。

  2. CTE - 公共表表达式是一个命名的临时结果集,用于操作复杂的子查询数据。这是针对声明范围而存在的。这是在内存中而不是 Tempdb 数据库中创建的。您无法在 CTE 上创建任何索引。

  3. 表变量就像一个变量,存在于特定批次的查询执行中。一旦超出批次,它就会自动丢弃。它也在 Tempdb 数据库中创建,但不在内存中创建。您不能在表变量上创建非聚集索引,除非该索引是表上 PRIMARY KEY 或 UNIQUE 约束的副作用。 如果结果集很小,表变量始终是最佳选择。


11
投票

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

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


0
投票

您使用多少笔交易来测试性能? 或者您只是分析查询路径?

© www.soinside.com 2019 - 2024. All rights reserved.