iT邦幫忙

0

MSSQL CTE運作原理請教

  • 分享至 

  • xImage

您好:
如下兩個範例,同樣用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筆
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2023-12-06 13:48:11

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,提供一些觀點供你參考.

我要發表回答

立即登入回答