我一直在使用CTE很長時間,但是我有一個關於CTE如何工作的問題。關於CTE的困惑
CTE每個查詢執行一次還是每行執行一次? (意味着它將首先執行,然後將結果傳遞到下部或執行一行並傳遞到查詢的下部)
因爲我們知道CTE在內存中執行,當我們使用相同的CTE時會發生什麼在同一個查詢中兩次?它會使用內存中的相同結果還是會再次計算它?
我一直在使用CTE很長時間,但是我有一個關於CTE如何工作的問題。關於CTE的困惑
CTE每個查詢執行一次還是每行執行一次? (意味着它將首先執行,然後將結果傳遞到下部或執行一行並傳遞到查詢的下部)
因爲我們知道CTE在內存中執行,當我們使用相同的CTE時會發生什麼在同一個查詢中兩次?它會使用內存中的相同結果還是會再次計算它?
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正確地完成它的工作並找到最佳的執行方法。
*不要擔心這一點。編寫你的查詢,以便你發現它們可讀,並依靠DBMS正確地完成它的工作並找到最好的執行方法。*直到你的DB決定選擇一個完全錯誤的執行計劃:-)非常複雜的cte和查詢)它可能發生:-( – xanatos
@xanatos:好吧,那麼我會讓它「擔心什麼時候該擔心」;-) –
您正在尋找一篇關於SO的論壇。 –
至少使用標記dbms。我們怎麼能知道一個未知的產品是如何工作的? – jarlh
這是與SQL有關的東西。所以我添加標籤爲sql – Munish