아니요 . Microsoft의 동작을 보증하는 문서가 없으므로 보장되지 않습니다 .
또한 Simple Talk 기사가 정확하고 Concatenation 실제 연산자가 항상 계획에 표시된 순서대로 입력을 처리한다고 가정하면 (매우 사실 일 수 있음) SQL Server가 항상 동일한 계획을 유지한다는 보장없이 쿼리 텍스트와 쿼리 계획 사이의 순서는 약간 나을뿐입니다.
우리는 이것을 더 조사 할 수 있습니다. 쿼리 최적화 프로그램이 연결 연산자 입력을 재정렬 할 수있는 경우, 문서화되지 않은 DMV에 sys.dm_exec_query_transformation_stats
해당 최적화에 해당하는 행이 있어야합니다 .
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
SQL Server 2012 Enterprise Edition에서는 24 행이 생성됩니다. 상수와 관련된 변환에 대한 잘못된 일치를 무시하면 Concatenation Physical Operator UNIAtoCON
(Union All to Concatenation) 와 관련된 변환이 하나 있습니다. 따라서 실제 연산자 레벨에서 연결 연산자를 선택하면 해당 연산자가 파생 된 논리적 전체 연합 연산자의 순서대로 처리됩니다.
사실 그것은 사실이 아닙니다. 비용 기반 최적화가 완료된 후 물리적 연결 연산자에 입력을 다시 정렬 할 수있는 최적화 후 재 작성이 있습니다. 하나의 예는 연결이 행 목표에 종속 될 때 발생합니다 (따라서 더 저렴한 입력에서 먼저 읽는 것이 중요 할 수 있습니다). 자세한 내용 은 Paul White의 UNION ALL
최적화 를 참조하십시오.
이 물리적 재 작성은 SQL Server 2008 R2까지 작동했지만 회귀는 더 이상 SQL Server 2012 이상에 적용되지 않았습니다. 쿼리 최적화 프로그램 핫픽스 (예 : 추적 플래그 4199)를 사용하여 SQL Server 2014 이상 (2012가 아님)에 대한이 다시 쓰기를 복원 하는 수정 프로그램이 발행되었습니다 .
그러나 Logical Union All 연산자 ( UNIA
)는 어떻습니까? UNIAReorderInputs
입력을 재정렬 할 수 있는 변환이 있습니다. 논리적 인 Union All UNIAtoCON
및 UNIAtoMERGE
(Union All to Merge Union) 을 구현하는 데 사용할 수있는 두 개의 실제 연산자도 있습니다 .
따라서 쿼리 최적화 프로그램 이 ;에 대한 입력을 다시 정렬 할 수 있는 것으로 보입니다 UNION ALL
. 그러나 일반적인 변환 UNIAReorderInputs
은 아닙니다. 쉽게 액세스 할 수있는 SQL Server에서 0 번 사용 하는 경우가 있습니다 UNIAReorderInputs
. 계획 지침서 또는 사용시 반드시 사용되지만 최적화 프로그램을 사용할 상황을 알 수 없습니다. plan hint는 위에서 언급 한 행 목표 물리적 재정렬 입력을 사용하여 생성 된 계획을 강제 실행하는 데 사용됩니다.
엔진이 한 번에 두 개 이상의 입력을 처리하는 방법이 있습니까?
연결 물리적 연산자는 계획의 병렬 섹션 내에 존재할 수 있습니다. 약간의 어려움으로 다음 쿼리를 사용하여 병렬 연결로 계획을 작성할 수있었습니다.
SELECT userid, regdate FROM ( --Users table is around 3mil rows
SELECT userid, RegDate FROM users WHERE userid > 1000000
UNION
SELECT userid, RegDate FROM users WHERE userid < 1000000
UNION all
SELECT userid, RegDate FROM users WHERE userid < 2000000
) d ORDER BY RegDate OPTION (RECOMPILE)
따라서 가장 엄격한 의미에서 물리적 연결 연산자는 항상 일관된 방식으로 입력을 처리하는 것처럼 보입니다 (맨 위, 맨 아래). 그러나 옵티마이 저는 실제 연산자를 선택하기 전에 입력 순서를 전환하거나 연결 대신 병합 통합을 사용할 수 있습니다.