2010-06-24 41 views
1

考慮下面的SQL(SQL Server 2008中)聲明:WITH語句如何存儲select查詢的記錄集?

WITH MyResult AS 
(
    SELECT 
    Name, 
    Row_ID AS ORD 
    FROM Person Where Gender = @Gender 
) 
SELECT * 
FROM MyResult 
WHERE ORD > 5 

是MyResult存儲在一個臨時表在tempdb?還是它做了別的事情?

我們優化一些查詢,並會艾克以更好地與語句(內部)瞭解,以幫助計性能等

感謝

回答

2

沒有,按this MSDN article

...的CTE是一種語言級別的 構造 - 意思是SQL Server不會 內部創建臨時或虛擬 表...

並且還as mentioned here

公共表表達式(CTE)可以是作爲臨時結果集 即一個SELECT,INSERT, UPDATE的執行 範圍內定義 思想,DELETE或CREATE VIEW 聲明。 CTE類似於 派生表,因爲它不作爲對象存儲 ,並且僅持續查詢的持續時間爲 。

+0

「...一個臨時結果集......」引發了我們認爲臨時結果集臨時存儲在某處的想法(即tempdb) – Russell 2010-06-24 09:18:11

+0

@Russell - 是的,我可以看到措辭有點混濁在這。本身使用CTE時,SQL Server不會創建臨時表。當然,就像任何查詢,CTE或者沒有CTE一樣,它可以根據發生的情況分頁到tempdb。但這不是特定於CTE的 – AdaTheDev 2010-06-24 09:21:47