2014-02-25 1 views
0

안녕하세요 저는 CTE에 익숙하지 않습니다. select case 문을 사용하여 하위 쿼리를 만들었습니다. CTE를 대신 사용하면 성능이 향상 될 수 있다고 앱 아키텍트가 지적 했으므로 몇 가지 시도를 시도해 보았습니다. 수정 된 쿼리는 다음과 같습니다.성능 향상을위한 SQL CTE

업데이트 ** 로컬 DB를 사용하고 있습니다. 전체 작동 쿼리를 추가 할 것입니다. 큰 것입니다. LEFT OUTER JOIN의 성능을 향상시키기 위해 알림을 받았지만 SELECT 문을 추가했습니다.

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로 개선 할 수있는 마지막 조인 선택 사례 문을 수정했습니다. 이것을 달성하는 방법에 대한 제안이나 조언을 주시면 감사하겠습니다.

+0

전체 작업 쿼리를 게시 할 수 있습니까? –

+2

어떤 데이터베이스를 사용하고 있습니까? –

+0

로컬 DB가 사용 중이며 전체 작업 쿼리가 게시되었습니다. – 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와 부질 버전은 일반적으로 동일한 실시 계획 ​​(NO 성능 이득)을 생성한다. 하위 쿼리를 여러 번 참조해야하는 경우 Cte 's를 사용하면 클리너를 사용하여 재귀를 허용 할 수 있습니다.