Sql-Server
一種處理 CTE 一次的方法?
我有一個存在嚴重性能問題的視圖,因為我將它連結到使用另一個視圖的 CTE,具有相同的表引用。
WITH splits(ID, [NEW TEU]) AS (SELECT s.[DTL ID] AS ID, s.[NEW TEU] FROM [POTS].[vwSPLITCARGO] AS s) SELECT * FROM [MISNT].[CARGO_MANIFEST_DETAIL_VIEW] AS cmd LEFT JOIN splits AS s ON s.ID = cmd.ID
該
vwSPLITCARGO
視圖引用同一個CARGO_MANIFEST_DETAIL_VIEW
表來進行計算。我知道為什麼它很慢。這是因為
vwSPLITCARGO
視圖正在從同一CARGO_MANIFEST_DETAIL_VIEW
視圖中讀取 CTE 中已存在的每條記錄的所有數據。事實上,vwSPLITCARGO
總是返回相同的小記錄集(大約 4 或 6 條記錄)。我不需要它來獲取那些記錄。一次會很棒!有沒有辦法讓 CTE 表現得像一個臨時表,因為它只檢索一次記錄,而不是一遍又一遍地處理?
告訴 CTE:
CASE WHEN RunOnce = 0 THEN "do it" ELSE "don't do it" END
沒有用於假離線或實現 CTE 的查詢提示。所以使用臨時表,並可選擇索引臨時表。
SELECT s.[DTL ID] AS ID, s.[NEW TEU] into #splits FROM [POTS].[vwSPLITCARGO] AS s; WITH splits(ID, [NEW TEU]) AS (select * from #splits) SELECT * FROM [MISNT].[CARGO_MANIFEST_DETAIL_VIEW] AS cmd LEFT JOIN splits AS s ON s.ID = cmd.ID