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 
相關問題