SQL Server 2012 (11.0.6020)에서 다소 간단한 테스트 베드를 작성하면을 통해 두 개의 해시 일치 쿼리가 연결된 계획을 다시 만들 수 있습니다 UNION ALL
. 내 테스트 베드에 잘못된 추정치가 표시되지 않습니다. 아마도 이것은 이다 는 SQL 서버 2014 CE 문제.
실제로 280 개의 행을 반환하는 쿼리에 대해 133.785 개의 행이 예상되지만 아래에서 더 자세히 볼 수 있습니다.
IF OBJECT_ID('dbo.Union1') IS NOT NULL
DROP TABLE dbo.Union1;
CREATE TABLE dbo.Union1
(
Union1_ID INT NOT NULL
CONSTRAINT PK_Union1
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, Union1_Text VARCHAR(255) NOT NULL
, Union1_ObjectID INT NOT NULL
);
IF OBJECT_ID('dbo.Union2') IS NOT NULL
DROP TABLE dbo.Union2;
CREATE TABLE dbo.Union2
(
Union2_ID INT NOT NULL
CONSTRAINT PK_Union2
PRIMARY KEY CLUSTERED
IDENTITY(2,2)
, Union2_Text VARCHAR(255) NOT NULL
, Union2_ObjectID INT NOT NULL
);
INSERT INTO dbo.Union1 (Union1_Text, Union1_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
INSERT INTO dbo.Union2 (Union2_Text, Union2_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
GO
SELECT *
FROM dbo.Union1 u1
INNER HASH JOIN sys.objects o ON u1.Union1_ObjectID = o.object_id
UNION ALL
SELECT *
FROM dbo.Union2 u2
INNER HASH JOIN sys.objects o ON u2.Union2_ObjectID = o.object_id;
내가 생각하는 이유는 결과 두 통계의 부족 주위에 그 UNION을하다 합류했다. SQL Server는 통계가 부족한 경우 열의 선택성에 대해 대부분의 경우에 대한 추측을해야합니다.
조 자루는에 흥미있는 읽기 여기를 .
A에 대한 UNION ALL
, 우리가 그러나 SQL 서버부터 행 사용하고, 노동 조합의 각 구성 요소에 의해 반환 된 행 정확히 총 수를 볼 수 있습니다 말을하는 것이 안전 추정 의 두 구성 요소에 대해 UNION ALL
, 우리는 볼 수는 총 추가 평가 모두에서 행을 연결 연산자에 대한 추정값을 제시합니다.
위의 예에서의 각 부분에 대한 예상 행 수 UNION ALL
는 66.8927이며, 합산하면 133.785와 같으며 연결 연산자의 예상 행 수에 대해 알 수 있습니다.
위의 통합 쿼리에 대한 실제 실행 계획은 다음과 같습니다.
"추정 된"vs "실제적인"행 수를 볼 수 있습니다. 필자의 경우 두 해시 일치 연산자에서 반환하는 "추정 된"행 수를 추가하면 연결 연산자에 표시된 양이 정확히 같습니다.
폴 화이트의 게시물에 권장 된대로 추적 2363 등에서 출력을 얻으려고합니다. 또는 OPTION (QUERYTRACEON 9481)
쿼리에서 사용 하여 버전 70 CE 로 되돌아 가서 문제가 "수정"되는지 확인할 수 있습니다.