2

이것은 CommonTableExpression이있는 SQL입니다. USERS_PROJECTS_CTE가 두 번 사용되었습니다.실행 계획의 CTE 성능. 두 번 표시되거나 두 번 처리됩니까?

WITH USERS_PROJECTS_CTE (PRO_ID, SHOW_IAS, USERNAME) 
    AS 
    (
     SELECT up.PRO_ID, up.SHOW_IAS, ISNULL(u.FIRST_NAME, '') + ' ' + ISNULL(u.SECOND_NAME, '') 
     FROM SFMIS07_PRO.USERS_PROJECTS up 
     INNER JOIN SFMIS07_ADM.USERS AS u 
       ON up.USER_ID = u.ID 
     WHERE up.IS_RESP_PERSON = 1 AND up.valid_to is null 
    ) 
    SELECT up.PRO_ID, 
      up1.USERNAME as RESP_USER1, 
      up2.USERNAME as RESP_USER2, 
      up.COUNT_ 
    FROM SFMIS07_PRO.PRO_RESP_USERS_KERNEL_MV AS up 
     LEFT JOIN USERS_PROJECTS_CTE AS up1 ON up.PRO_ID = up1.PRO_ID AND up1.SHOW_IAS=1 
     LEFT JOIN USERS_PROJECTS_CTE AS up2 ON up.PRO_ID = up2.PRO_ID AND up2.SHOW_IAS=0 

실행 계획. CTE가 두 번 표시합니다 : enter image description here

질문 :

  1. 내가 두 번 밖에 표시되지만 두 번 처리되지 CTE가 맞나요 무엇입니까?
  2. CTE를 다시 사용하도록 QO에 알릴 수 있습니까?
  3. QO는 원칙적으로 "동일한 SQL 단편"을 감지하고 결과를 재사용 할 수 있습니다 (필자는 이미 준비된 데이터를 대처함으로써 상상할 수 있습니다).
  4. 임시 테이블을 사용하지 않고 쿼리를 최적화하는 방법은 무엇입니까?

답변

4

오전 내가 바로 CTE는 두 번 표시되지 않도록하지만, 두 번 처리?

그것은 CTE를 재사용 할 수 QO를 통보 할 수 있습니까?

직접적으로는 아니지만이를 권장할만한 해킹이 있습니다.

"는 동일한 SQL 단편"을 검출하는 원리 QO 가능한 것이있다 재사용 결과 (I이 실현 상상 - 이미 준비된 데이터를 대응하여)?

원칙적으로 그렇습니다. 예제는 Microsoft Research Paper Efficient Exploitation of Similar Subexpressions for Query Processing을 참조하십시오.

임시 테이블을 사용하지 않고 쿼리를 최적화하는 방법은 무엇입니까?

가장 신뢰할 수있는 방법은 일시적인 (임시가 아닌) 테이블을 사용하는 것입니다. 좀 더 해킹 된 해결 방법은 Provide a hint to force intermediate materialization of CTEs or derived tables을 참조하십시오.

+0

QO 중복 제거 조인을 본 적이 있습니까? 2012 년 현재이 기능이 완전히 없어 졌다고 생각합니다. – usr

+0

@usr - 예 연구 논문의 자료는 AFAIK의 모든 제품에 적용되지 않았습니다. 나는 "원칙적으로"부분에 대답하고있었습니다. 현재 중간 구현을 원한다고 명시 적으로 할 수 없다면'TOP (2147483647)'해킹 같은 것들에 의존해야합니다. –

+0

그냥 추가 : 해킹 "탑 2147483647"자기 조인 (내가 undestand 원칙으로) 작동하지 않습니다 –