왜 변수 테이블을 강제로는 인덱스 검사 동안 임시 테이블을 사용하여 추구하고 책갈피 조회?
문제
내가 노력하고 있는 이유를 이해하 테이블을 사용하여 변수를 방지하기 최적화 프로그램을 사용하여 인덱스를 추구하고 그 책갈피 조회 대 index scan 을 사용합니다.
채워 테이블:
CREATE TABLE dbo.Test
(
RowKey INT NOT NULL PRIMARY KEY,
SecondColumn CHAR(1) NOT NULL DEFAULT 'x',
ForeignKey INT NOT NULL
)
INSERT dbo.Test
(
RowKey,
ForeignKey
)
SELECT TOP 1000000
ROW_NUMBER() OVER (ORDER BY (SELECT 0)),
ABS(CHECKSUM(NEWID()) % 10)
FROM sys.all_objects s1
CROSS JOIN sys.all_objects s2
CREATE INDEX ix_Test_1 ON dbo.Test (ForeignKey)
채우는 변수 테이블을 가진 하나의 기록을 조회합본 키고 두 번째 열에 의해에 찾는 외국 키를 열:
DECLARE @Keys TABLE (RowKey INT NOT NULL)
INSERT @Keys (RowKey) VALUES (10)
SELECT
t.RowKey,
t.SecondColumn
FROM
dbo.Test t
INNER JOIN
@Keys k
ON
t.ForeignKey = k.RowKey
아래에 실행 계획:
지금 같은 쿼리를 사용하여 임시 테이블 대신:
CREATE TABLE #Keys (RowKey INT NOT NULL)
INSERT #Keys (RowKey) VALUES (10)
SELECT
t.RowKey,
t.SecondColumn
FROM
dbo.Test t
INNER JOIN
#Keys k
ON
t.ForeignKey = k.RowKey
이 쿼리 계획을 사용하여 추구하고 북마크 검색:
왜 최적화 프로그램은 기꺼이 하는 책갈피 조회와 임시 테이블,하지만 변수 테이블?
이 변수 테이블은 이 예제에 사용되는 사용을 나타내는 데이터를 통해 사용자 정의 테이블 형식에 저장되는 절차입니다.
하지만 그게 아니라는 것을 깨달았 지수 추이 적합하지 않을 수도 있습 경우에는 외국인 키 값을 발생한 수백 수천의 시대.이 경우,검사 것 아마도 더 나은 선택입니다.시나리오를 위해 만든 없었 행의 값으로 10.나는 아직도 생각하는 행동이 재미있고는지 알고 싶은 경우에는 이유가 있습니다.
추가 OPTION (RECOMPILE)
을 변경하지 않았기에 시작해야 한다.Uddt 에 사용할 수 있는 기본 핵심이다.
@@VERSION
은 SQL Server2008R2(SP2)-10.50.4042.0(64)(빌 7601:서비스팩 1)(하이퍼 바이저)
해결책
이유는 행동에 대한 SQL 서버는지 확인할 수 없 얼마나 많은 행 일치하 ForeignKey,이 없기 때문에 인덱스 RowKey 으로 선도하는 열(수 있습니다 추론 이 통계에#temp 테이블,하지만 사람들이 존재하지 않는한 변수 테이블/UDTTs),그래서 그것은 예상의 100,000 행는 더 나은 처리 검사보다는 추+조회입니다.시간 SQL 서버를 실현 거기에 하나의 행만,너무 늦었습니다.
할 수 있을 구성하 UDTT 르;더 현대적인 버전의 SQL 서버를 만들 수 있습 보조에 인덱스 테이블의 변수이지만,이 구문에서 사용할 수 없 2008R2.
BTW 을 얻을 수 있습을 추구하는 동작(적어도 내한 시험)는 경우를 피하려고 비트맵/프로브 암시하여 중첩된 루프 조인:
DECLARE @Keys TABLE (RowKey INT PRIMARY KEY); -- can't hurt
INSERT @Keys (RowKey) VALUES (10);
SELECT
t.RowKey
,t.SecondColumn
FROM
dbo.Test t
INNER JOIN
@Keys k
ON
t.ForeignKey = k.RowKey
OPTION (LOOP JOIN);
나 이것을 배웠 속에서 바울은 흰색 몇 년 전입니다.물론,주의해야 할 모든 종류의 가입하세에서 힌트를 생산 코드-이 실패할 수 있습니다면 사람들이 변화하는 기본 개체고는 특정 유형의 가입은 가능한 더 이상 또는 더 이상 대부분 최적입니다.
더 복잡한 쿼리를 이동할 때는 SQL Server2012 또는 위한 추적 플래그 2453 이 도움이 될 수 없습니다.는 국기 도움이 되지 않으로 이단입니다,하지만.과 같은 부인 것 적용됩니다-이것은 단지 다른 것은 없는 일반적으로 하지 않고는 톤의 문서와 엄격한 회귀분 테스트 절차에는 장소입니다.
다른 팁
변수 테이블과 temp 테이블은 다르게 처리에서 수 있습니다.가 훌륭한 여기에 해답이 의 많은 구체적인 곳으로 그들은 다릅니다.
특별히 귀하의 경우에는 내가 생각했던 것과는 사실 temp 테이블이 있을 수 있는 추가적인 통계를 생성하고 병렬 계획하는 동안 변수 테이블이 제한적 통계(열 수준을 통계)및 병렬 계획은 귀하의 원인이다.
당신은 잘 될 수 있습니다 더 나을 덤핑 테이블이 변수로 임시 테이블 기간 저장된 절차입니다.