2010-05-18 65 views

回答

3

除非使用遞歸功能,否則CTE在性能方面並不比簡單的內聯視圖更好。

它只是爲您節省一些打字。

優化程序可以自由決定是否重新評估與否,當它被重用,這決定它大多數情況下,重新評估:

WITH q (uuid) AS 
     (
     SELECT NEWID() 
     ) 
SELECT * 
FROM q 
UNION ALL 
SELECT * 
FROM q 

將返回兩個不同NEWIDs

請注意,其他引擎可能會有不同的行爲。與SQL Server不同,實現CTEs

Oracle支持一個特殊的提示/*+ MATERIALIZE */,告訴優化器是否應該實現CTE

5

我不能完全肯定的性能優勢,但我認爲它可以在一定的情況下幫助地方使用子查詢的結果該子查詢被執行多次。

除此之外,它確實可以使代碼更具可讀性,並且還可以用於多個子查詢將在不同位置剪切和粘貼相同代碼的情況。

使用前應該知道什麼? 一個很大的缺點是,當你在一個視圖中有一個CTE時,你不能在該視圖上創建一個聚集索引。這可能是一個很大的麻煩,因爲SQL Server沒有物化視圖,而且之前肯定會咬我。

+1

無法接受兩個答案,但謝謝:) – hgulyan 2010-05-19 10:47:36

0

with是SQL中的一個關鍵字,它將臨時結果存儲在臨時表中。例如:

with a(--here a is the temporary table) 
(id)(--id acts as colomn for table a) 
as(select colomn_name from table_name) 

select * from a