簡體   English   中英

何時在存儲過程中使用CTE

[英]When to use CTE in Stored Procedure

SELECT 
    tchart.*
INTO
    #OrderSections
FROM 
    Order.Charts tchart
INNER JOIN
    (
    SELECT  
        tchart.ID,
        tchart.ORCode,
        tchart.SectionalDistance,
        row_number() OVER( PARTITION BY rrs.ORCode ORDER BY tchart.VendorTimestampUTC DESC, tchart.InsertedTimestampUTC DESC, tchart.ID DESC ) AS RecordIndex
    FROM
        #OrderStaging rrs
    INNER JOIN
        Order.Charts tchart
    ON
        rrs.ORCode = tchart.ORCode
    ) AS Latest_tchart
ON
    tchart.ID = Latest_tchart.ID
WHERE
    Latest_tchart.RecordIndex   = 1;

    With cte as(    
    SELECT  
        tchart.ID,
        tchart.ORCode,
        tchart.SectionalDistance,
        row_number() OVER( PARTITION BY rrs.ORCode ORDER BY tchart.VendorTimestampUTC DESC, tchart.InsertedTimestampUTC DESC, tchart.ID DESC ) AS RecordIndex
    FROM
        #OrderStaging rrs
    INNER JOIN
        Order.Charts tchart
    ON
        rrs.ORCode = tchart.ORCode) 
    SELECT 
        cte.*
    INTO
        #OrderSections
    FROM 
        cte
    WHERE 
        RecordIndex = 1  

CTE是否會對存儲過程產生特別大的影響?

要回答有關性能和執行計划的問題,您應該查看查詢的特定計划。

但是,我希望查詢具有相同的執行計划,而不管邏輯是在子查詢中還是在CTE中。 在SQL Server中是這樣,但在其他數據庫中則不是。 例如,Postgres實現了CTE,因此您會期望性能有所不同。

編輯:

分層查詢需要CTE(遞歸CTE)。 對於其他查詢,它們很方便-並且非常方便,因為您可以在同一查詢中多次引用CTE。 但是,它們對SQL Server中的執行計划沒有特定的影響。 將CTE替換為查詢,並一次優化整個處理過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM