이것은 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가 두 번 표시합니다 :
질문 :
- 내가 두 번 밖에 표시되지만 두 번 처리되지 CTE가 맞나요 무엇입니까?
- CTE를 다시 사용하도록 QO에 알릴 수 있습니까?
- QO는 원칙적으로 "동일한 SQL 단편"을 감지하고 결과를 재사용 할 수 있습니다 (필자는 이미 준비된 데이터를 대처함으로써 상상할 수 있습니다).
- 임시 테이블을 사용하지 않고 쿼리를 최적화하는 방법은 무엇입니까?
QO 중복 제거 조인을 본 적이 있습니까? 2012 년 현재이 기능이 완전히 없어 졌다고 생각합니다. – usr
@usr - 예 연구 논문의 자료는 AFAIK의 모든 제품에 적용되지 않았습니다. 나는 "원칙적으로"부분에 대답하고있었습니다. 현재 중간 구현을 원한다고 명시 적으로 할 수 없다면'TOP (2147483647)'해킹 같은 것들에 의존해야합니다. –
그냥 추가 : 해킹 "탑 2147483647"자기 조인 (내가 undestand 원칙으로) 작동하지 않습니다 –