2014-02-25 58 views
0

你好我对CTE不是很熟悉。我使用select case语句创建了一个子查询,应用架构师指出,如果使用CTE,性能可能会提高,但我尝试了几次尝试,结果没有成功,这是我修改的查询:SQL CTE提高性能

更新** 我正在使用本地数据库。我会添加完整的工作查询,尽管这是一个很大的问题,我只是被告知增加了左外部连接的性能,我添加了select case语句。

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  

我修改了最后一个可以用CTE改进的join select case语句。 任何建议或指示如何实现这一点将不胜感激。

+0

你能发表您的整个工作的查询? –

+2

你正在使用什么数据库? –

+0

本地数据库正在使用,整个工作查询已发布。 – user3312107

回答

0

下面是一个子查询和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's可以更清晰,并且它们允许递归。