Sql-Server

一種處理 CTE 一次的方法?

  • July 1, 2020

我有一個存在嚴重性能問題的視圖,因為我將它連結到使用另一個視圖的 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

引用自:https://dba.stackexchange.com/questions/270169