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