2016-02-10 291 views
0

我一直在使用CTE很長時間,但是我有一個關於CTE如何工作的問題。關於CTE的困惑

  1. CTE每個查詢執行一次還是每行執行一次? (意味着它將首先執行,然後將結果傳遞到下部或執行一行並傳遞到查詢的下部)

  2. 因爲我們知道CTE在內存中執行,當我們使用相同的CTE時會發生什麼在同一個查詢中兩次?它會使用內存中的相同結果還是會再次計算它?

+0

您正在尋找一篇關於SO的論壇。 –

+1

至少使用標記dbms。我們怎麼能知道一個未知的產品是如何工作的? – jarlh

+0

這是與SQL有關的東西。所以我添加標籤爲sql – Munish

回答

1

CTE主要是爲了讓我們的查詢結構更好的可讀性。

這個查詢:

with blue_items as (select * from items where color = 'blue') 
    , lightblue_items as (select * from blue_items where tone = 'pale') 
select * 
from lightblue_items; 

相同

select * 
from (select * from (select * from items where color = 'blue') where tone = 'pale'); 

唯一不同的寫入。這取決於DBMS如何執行它。它甚至可以將內部重新編寫爲

select * from items where color = 'blue' and tone = 'pale'; 

與自連接相同。 DBMS如何執行以下查詢又取決於DBMS。它會嘗試找到最佳執行計劃,其中可能是意思是讀取表格兩次來讀取一次,並在內存中對其進行操作。

with cte as (select * from persons) 
select * 
from cte p1 
join cte p2 on p2.personid <> p1.personid; 

不要擔心這一點。編寫你的查詢,以便你發現它們可讀,並依靠DBMS正確地完成它的工作並找到最佳的執行方法。

+0

*不要擔心這一點。編寫你的查詢,以便你發現它們可讀,並依靠DBMS正確地完成它的工作並找到最好的執行方法。*直到你的DB決定選擇一個完全錯誤的執行計劃:-)非常複雜的cte和查詢)它可能發生:-( – xanatos

+1

@xanatos:好吧,那麼我會讓它「擔心什麼時候該擔心」;-) –