簡體   English   中英

SQL CTE提高性能

[英]SQL CTE to improve performance

您好,我對CTE不太熟悉。 我使用select case語句創建了一個子查詢,應用架構師向我指出,如果改用CTE可以提高性能,但我嘗試了幾次嘗試均未成功,這是我修改的查詢:

更新**我正在使用本地數據庫。 我將添加一個完整的工作查詢,盡管這是一個很大的通知,但我只收到通知,以提高向我添加了select case語句的LEFT OUTER JOIN的性能。

    IF EXISTS (SELECT * FROM sysobjects WHERE type = 'V' AND name = 'VW_TRPRINT_TITLERECORD1')
    BEGIN
        DROP  View VW_TRPRINT_TITLERECORD1
    END
GO

Create VIEW VW_TRPRINT_TITLERECORD1
 as 
SELECT               
distinct(T.TTL_NUMBER), T.OWNERSHIP_DOC_ID      
, OD.TXN_ID    
, TX.TXN_DATE    
, OWNSHIP.CUS_ID   

, PTA.CUS_FULLNAME_PART1 AS PRIMARY_OWNER_NAME  
, PTA.CUS_FULLNAME_PART2 AS SECOND_OWNER_NAME  
, PTA.CUS_ADDR_ID   

, CUST_ADDR.ADDRESS_LINE_1 AS PRIMARY_OWNER_STREET_LINE_1                        --PRIMARY OWNER NAME AND ADDRESS DETAILS    
, CUST_ADDR.CITY  AS PRIMARY_OWNER_CITY    
, CUST_ADDR.STATE AS PRIMARY_OWNER_STATE    
, CUST_ADDR.ZIP_CODE AS PRIMARY_OWNER_ZIP_CODE    
, CUST_ADDR.ZIP_PLUS AS PRIMARY_OWNER_ZIP_PLUS    
, CUST_ADDR.POSTNET_BARCODE  AS PRIMARY_OWNER_COUNTY    


, PTA.FIRST_LIEN_NAME  AS FIRST_SECURED_NAME  
, PTA.FIRST_LOAN_DATE AS  LOAN_DATE  
, PTA.FIRST_LIEN_ADDRESS_ID   


, FIRST_LIEN_ADDR.ADDRESS_LINE_1 AS FIRST_SECURED_STREET_LINE_1                   --FIRST SECURED PARTY ADDRESS DETAILS     
, FIRST_LIEN_ADDR.CITY  AS FIRST_SECURED_CITY    
, FIRST_LIEN_ADDR.STATE AS FIRST_SECURED_STATE    
, FIRST_LIEN_ADDR.ZIP_CODE AS FIRST_SECURED_ZIP_CODE    
, FIRST_LIEN_ADDR.ZIP_PLUS AS FIRST_SECURED_ZIP_PLUS    
, FIRST_LIEN_ADDR.POSTNET_BARCODE  AS FIRST_LIEN_COUNTY   

, PTA.SECOND_LIEN_NAME AS SECOND_SECURED_PARTY_NAME  
, PTA.SECOND_LOAN_DATE   
, PTA.SECOND_LIEN_ADDRESS_ID   
, PTA.MAIL_TITLE_TO_SECURED_PARTY   

, SECOND_LIEN_ADDR.ADDRESS_LINE_1 AS SECOND_SECURED_STREET_1                     --SECOND SECURED PARTY ADDRESS DETAILS
, SECOND_LIEN_ADDR.CITY  AS SECOND_SECURED_CITY   
, SECOND_LIEN_ADDR.STATE AS SECOND_SECURED_STATE    
, SECOND_LIEN_ADDR.ZIP_CODE AS SECOND_SECURED_ZIPCODE    
, SECOND_LIEN_ADDR.ZIP_PLUS AS SECOND_SECURED_ZIP_PLUS    
, SECOND_LIEN_ADDR.POSTNET_BARCODE  AS SECOND_LIEN_COUNTY   

, TMP.ADDRESSEE  AS SPECIAL_MAIL_NAME                                             --SPECIAL MAILING NAME AND ADDRESS DETAILS       
, TMP.ADDRESS_LINE_1 AS SPECIAL_MAILING_LINE_1    
, TMP.CITY AS SPECIAL_MAILING_CITY    
, TMP.STATE AS SPECIAL_MAILING_STATE    
, TMP.ZIP_CODE AS SPELCIAL_MAILING_ZIP_CODE    
, TMP.ZIP_PLUS AS SPECIAL_MAILING_ZIP_PLUS    
, TMP.POSTNET_BARCODE AS SPELCIAL_MAILING_COUNTY     

, MAIL_TO_NAME   
, MAIL_TO_ADDR.ADDRESS_LINE_1 AS MAIL_TO_STREET_LINE_1  
, MAIL_TO_ADDR.CITY AS MAIL_To_CITY
, CASE WHEN MAIL_TO_ADDR.STATE = '' THEN 
    NULL ELSE
    MAIL_TO_ADDR.STATE END AS
    MAIL_TO_STATE    
, CASE WHEN MAIL_TO_ADDR.ZIP_CODE = '' THEN
    NULL ELSE
    MAIL_TO_ADDR.ZIP_CODE END AS
    MAIL_TO_ZIP_CODE    
, MAIL_TO_ADDR.ZIP_PLUS AS MAIL_TO_ZIP_PLUS    
, MAIL_TO_ADDR.POSTNET_BARCODE  AS MAIL_TO_ZIP_COUNTY   


,'MAILING_CODE' = CASE               
    --WHEN TMP.ADDRESS_ID IS NOT NULL THEN 'M'    
    WHEN PTA.MAIL_TITLE_TO_SECURED_PARTY = 1  THEN 'S'              
    WHEN TMP.ADDRESS_ID IS NULL AND OWNSHIP.IS_MAIL_OWNER = 1 AND PTA.MAIL_TITLE_TO_SECURED_PARTY = 0 AND (PTA.CUS_ADDR_ID = PTA.MAIL_TO_ADDRESS_ID OR MAIL_TO_ADDR.ADDRESS_LINE_1 = CUST_ADDR.ADDRESS_LINE_1) THEN '' 
    ELSE 'M'
 END         

 FROM VW_NONVOIDED_TITLES T               

 INNER JOIN PRESERVE_TITLE_ATTRIBUTES PTA ON PTA.TITLES_ID  = T.ID  
 LEFT OUTER JOIN  ADDRESSES CUST_ADDR ON CUST_ADDR.ID = PTA.CUS_ADDR_ID     
 LEFT OUTER JOIN ADDRESSES FIRST_LIEN_ADDR ON FIRST_LIEN_ADDR.ID = PTA.FIRST_LIEN_ADDRESS_ID  
 LEFT OUTER JOIN ADDRESSES SECOND_LIEN_ADDR ON SECOND_LIEN_ADDR.ID = PTA.SECOND_LIEN_ADDRESS_ID   
 LEFT OUTER JOIN ADDRESSES MAIL_TO_ADDR ON MAIL_TO_ADDR.ID = 
    (SELECT                 
                CASE WHEN SMA.DOC_ID = 6 THEN 
                    PTA.CUS_ADDR_ID  
                ELSE
                PTA.MAIL_TO_ADDRESS_ID  
                END
            FROM
            PRESERVE_TITLE_ATTRIBUTES PA
            INNER JOIN SPECIAL_MAILING_ADDRESS SMA ON SMA.ADDRESS_ID = PTA.MAIL_TO_ADDRESS_ID AND PA.ID  =PTA.ID )   

  /*Title Contains a Second Owner*/      
 INNER JOIN VW_NONVOIDED_OWNERSHIP_DOCUMENT OD ON OD.ID = T.OWNERSHIP_DOC_ID  --AND OD.END_DATE IS NULL   
 INNER JOIN VW_NONVOIDED_OWNERSHIPS OWNSHIP ON OWNSHIP.OWNERSHIP_DOCUMENT_ID = OD.ID AND OWNSHIP.IS_MAIL_OWNER = 1 --AND OWNSHIP.END_DATE IS NULL   
 INNER JOIN VW_NONVOIDED_VEHICLES V ON V.ID = OD.VEH_ID AND V.END_DATE IS NULL    
 INNER JOIN TXN TX ON TX.ID = OD.TXN_ID    

我修改了最后一個join select case語句,可以通過CTE進行改進。 任何建議或有關如何實現這一目標的指針將不勝感激。

這是子查詢和CTE的語法。

子查詢:

SELECT *
FROM (SELECT *
      FROM Table1
      WHERE Stuff = 'Wee'
      )sub

CTE:

WITH cte AS (SELECT *
             FROM Table1
             WHERE Stuff = 'Wee')
SELECT *
FROM cte

同一查詢的等效cte和子查詢版本通常將生成相同的執行計划(不會提高性能)。 當必須多次引用子查詢時,Cte可以更清潔,並且它們允許遞歸。

暫無
暫無

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

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