您好:
如下兩個範例,同樣用CROSS APPLY
16*3=48筆資料
直接用cte內的資料 來做,變得很慢,要2秒才出來
若改用先將3筆資料寫入暫存檔,再cross apply就不到1秒出來
請問在CTE 內的區塊撈出來的資料,應該是暫存起來了吧
再給下一個查詢用?
而不是 要用的時候,再回去撈取?
向這樣的情況,該如何解釋?
謝謝
--------------------------------------這一段,需要2秒鐘
;with t as(
/* ------3筆 */
SELECT
A, B,C
from V_TRACE
WHERE ....
)SELECT * FROM (
SELECT v.* /*-------16筆----------*/
from v_py v
WHERE ....
) v cross apply (
SELECT * FROM t /*------3筆------------*/
) x
--------結果 48筆
------------------------------------------改用 #temp,不到1秒
SELECT A, B,C
into #temp
from V_TRACE
WHERE ....
;with t as(
SELECT * FROM (
SELECT v.* /*-------16筆----------*/
from v_py v
WHERE ....
) v cross apply (
SELECT * FROM #temp t /*------3筆------------*/
) x
)SELECT * FROM t
--------結果 48筆
CTE vs temp tables
https://www.brentozar.com/archive/2019/06/whats-better-ctes-or-temp-tables/
DBMS 通常會有 Result Cache, 所以有時候在做語法比較時,第二道指令會去使用Cache,
然後就比較快.
https://stackoverflow.com/questions/1873025/how-can-i-clear-the-sql-server-query-cache
https://www.mssqltips.com/sqlservertip/4714/different-ways-to-flush-or-clear-sql-server-cache/
我手頭上沒有SQL Server,提供一些觀點供你參考.