14

使用CTE(公用表表达式)而不是使用临时表有没有好处。CTE和TEMP表格之间的主要区别是什么?

我经历了两者之间的性能测试,但我无法找到它们之间的很多区别。使用CTE'S有什么优点和缺点?

+9

从DBA的网站[什么是CTE和临时表之间的区别?(http://dba.stackexchange.com/q/13112/ 3690) –

+0

我对性能差异了解不多,但是cte允许简单的循环和递归,如果查询输出将被多次访问并且重新运行将浪费时间,那么临时表很方便。 –

+1

他们是不同的东西,真的是课程的马匹。哪一个最好取决于你的确切场景。你的问题不比'使用视图而不是表格有什么好处?'含义不明确。 – GarethD

回答

12

CTE和临时表之间最大的区别可能在于,CTE的执行范围为SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围为单一

基本上,您不能重复使用CTE,就像您可以使用临时表一样。

documentation

公共表表达式(CTE)可以被看作是一个单个 SELECT,插入,更新,删除或执行范围内定义的临时 结果集CREATE VIEW语句。 CTE是 类似于派生表,因为它不作为对象存储,并且 仅在查询期间持续。与派生表不同,派生表不同,一个 CTE可以自引用并且可以在 多次引用相同的查询。

的CTE可用于:

  1. 创建递归查询。有关更多信息,请参阅使用公用表表达式的递归查询。

  2. 当不需要使用视图时替代视图;也就是说,您不必将定义存储在元数据中。

  3. 通过从标量子查询派生的列或者非确定性或具有外部访问权限的函数启用分组。

  4. 在同一语句中多次引用结果表。

+17

对我而言,最大的不同在于一个是实际表格,另一个不是。 “WITH CTE AS(SELECT * FROM MillionRowTable)SELECT TOP 1 * FROM CTE'和'INSERT INTO #T SELECT * FROM MillionRowTable; SELECT TOP 1 * FROM#T' –

+2

@MartinSmith您的评论比答案本身有更多的票! –

+0

它也可以用另一种方式:'insert into#table'然后'select ..其中xyz不在#table'中是快速的,但是重写为CTE会使其超速。 –

3

CTE: CTE代表公共表表达式。它是在SQL Server 2005中引入的。它用于在临时基础上存储复杂子查询的结果。它的生命局限于当前的查询。它通过使用WITH语句来定义。它主要用于递归调用。

;with myCTE as 
(
    select ParentLevel, ParentID, ChildID 
    from MHA 
    where ChildID = 1 
    UNION ALL 
    select MHA.ParentLevel, MHA.ParentID, MHA.ChildID 
    from MHA 
    inner join myCTE on MHA.ParentID = myCTE.ChildID 
    where MHA.ParentID <> 0 
) 

(误差)

select top (5) * from myCTE 

所以在上述例子中,我已创建CTE名称作为myCTE,只能被在上面的查询(I可以用不使用上述查询的myCTE出侧)

TEMP:它也可以用来存储查询的临时结果bases.But它的生命是有限的当前会话。它使用#定义。它不支持递归。

例子:

select * into #tempTable from MHA 

在上面的查询中,我创建临时表,现在我可以在会话中使用它临时表了这个查询的一面,但用。见下面

(没有错误)

select top (5) * from #tempTable 
相关问题