13

CTE(Common Table Expression) vs Temp tablesor Table variables,哪个更快?

4

3 回答 3

32

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

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

但是,要记住一些要点:

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

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

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

于 2011-03-15T10:47:26.920 回答
16

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

SQL Server 中 CTE 与 Temp 表和表变量的区别

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

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

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

于 2013-11-08T17:26:38.070 回答
8

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

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

于 2011-03-15T10:46:45.833 回答