我對WITH語句(CTE)的理解是,它對每個查詢執行一次。有了這樣的查詢:WITH語句每個查詢執行一次還是每行執行一次?
WITH Query1 AS (...)
SELECT *
FROM
SomeTable t1
LEFT JOIN Query1 t2 ON ...
如果這導致100行,我希望Query1
是隻執行一次 - 不是100倍。如果該假設是正確的,則運行整個查詢所用的時間大致等於所花費的時間:運行Query1
+從SomeTable
+加入SomeTable
到Query1
。
我在的情況下:
單獨運行需要約5秒(400K行)時Query1
。- 查詢的其餘部分在刪除
WITH
語句和LEFT JOIN
後需要約15秒(400k行)。
因此,運行與WITH
語句和整個查詢到位LEFT JOIN
的時候,我本來期望的查詢及時完成,而不是我讓它運行了一個多小時,並一度停止它只有11k行。
我明顯錯了,但爲什麼?
感謝您的詳細回覆。這就說得通了。就我而言,我沒有兩次加入CTE,只有一次從普通桌面加入CTE。但我認爲你所說的仍然適用。對我來說,似乎很奇怪的是,SQL Server並沒有將CTE視爲一張臨時表 - 這就是我認爲它會起作用的原因。 –
'CTE'是*本地* **視圖**。所以,何時使用,CTE會像其他視圖一樣展開。 –
剛剛看到這篇文章時,試圖找出爲什麼我的查詢與12 CTE的慢。每個人執行超過8000次。謝謝你的提示! –