결과가 정확히 3 개의 다른 guid와 더 이상 나오지 않게하는 방법이 있습니까? SQL Server CTE의 단점을 극복하기 위해 여러 번 참조되는 CTE 유형 쿼리와 함께 계획 가이드를 포함하여 향후 질문에 더 잘 답변 할 수 있기를 바랍니다.
오늘 말고. 비 재귀 공통 테이블 표현식 (CTE)은 인라인 뷰 정의로 처리되고 최적화 전에 참조되는 각 위치 (정규 뷰 정의와 동일)에서 논리 쿼리 트리로 확장됩니다. 쿼리의 논리 트리는 다음과 같습니다.
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
최적화가 시작되기 전에 View Anchors 2 개와 내장 함수 6 개 호출에 주목하십시오 newid
. 그럼에도 불구하고 많은 사람들은 최적화 프로그램이 확장 된 하위 트리가 원래 단일 참조 객체임을 식별하고 그에 따라 단순화해야한다고 생각합니다. CTE 또는 파생 테이블의 명시적인 구체화를 허용하기위한 몇 가지 Connect 요청 도있었습니다 .
보다 일반적인 구현에서는 옵티마이 CASE
저가 성능을 향상시키기 위해 임의의 공통 표현식을 구체화하는 것을 고려하게됩니다 ( 하위 쿼리 를 사용하면 오늘날 문제 가 발생할 수있는 또 다른 예 입니다). Microsoft Research 는 2007 년에 그 당시 의 논문 (PDF)을 발표 했지만 현재까지는 구현되지 않았습니다. 당분간 우리는 테이블 변수 및 임시 테이블과 같은 것을 사용하여 명시 적 구체화로 제한됩니다.
SQLKiwi는 SSIS에서 계획을 세우는 것에 대해 언급했습니다. SQL Server에 대한 올바른 계획을 세우는 데 도움이되는 방법이나 유용한 도구가 있습니까?
이것은 제 생각 에 단지 희망 이었고 계획 지침을 수정한다는 생각을 훨씬 뛰어 넘었습니다. 원칙적으로 쇼 계획 XML을 직접 조작하는 도구를 작성하는 것이 가능하지만, 도구를 사용한 특정 최적화 도구가 없으면 사용자에게는 실망스러운 경험이 될 것입니다 (그리고 개발자가 생각하게됩니다).
이 질문의 특정 맥락에서, 이러한 도구는 여러 소비자가 사용할 수있는 방식으로 CTE 내용을 구체화 할 수 없습니다 (이 경우 두 입력을 교차 조인에 공급하기 위해). 옵티 마이저 및 실행 엔진은 다중 소비자 스풀을 지원하지만 특정 목적으로 만 사용되며이 특정 예제에는 적용 할 수 없습니다.
확실하지는 않지만 쿼리가 계획과 정확히 동일하지 않더라도 RelOps를 따를 수 있습니다 (Nested Loop, Lazy Spool). 예를 들어 CTE에 4와 5를 추가 한 경우 , 여전히 동일한 계획을 사용합니다 (SQL Server 2012 RTM Express에서 테스트 됨).
여기에는 상당한 양의 유연성이 있습니다. XML 계획의 광범위한 형태는 최종 계획에 대한 검색 을 안내 하는 데 사용됩니다 (교환에서 파티션 유형과 같은 많은 속성이 완전히 무시되지만) 일반 검색 규칙도 상당히 완화됩니다. 예를 들어, 비용 고려 사항을 기반으로 한 대안의 조기 제거는 사용 불가능하고, 교차 결합의 명시적인 도입이 허용되며 스칼라 조작은 무시됩니다.
이 깊이 들어가 너무 많은 세부 사항이 있지만, 필터 및 계산 스칼라의 배치는 강제 할 수 없으며, 형태의 술어는 column = value
계획이 포함되도록 일반화 X = 1
또는 X = @X
포함 된 쿼리에 적용 할 수있는 X = 502
나 X = @Y
. 이러한 특정 유연성은 자연적인 계획을 찾는 데 큰 도움이 될 수 있습니다.
특정 예에서, Constant Union All은 항상 Constant Scan으로 구현 될 수 있습니다. Union All에 대한 입력 수는 중요하지 않습니다.