문제

내가 노력하고 있는 이유를 이해하 테이블을 사용하여 변수를 방지하기 최적화 프로그램을 사용하여 인덱스를 추구하고 그 책갈피 조회 대 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

아래에 실행 계획:

enter image description here

지금 같은 쿼리를 사용하여 임시 테이블 대신:

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

이 쿼리 계획을 사용하여 추구하고 북마크 검색:

enter image description here

왜 최적화 프로그램은 기꺼이 하는 책갈피 조회와 임시 테이블,하지만 변수 테이블?

이 변수 테이블은 이 예제에 사용되는 사용을 나타내는 데이터를 통해 사용자 정의 테이블 형식에 저장되는 절차입니다.

하지만 그게 아니라는 것을 깨달았 지수 추이 적합하지 않을 수도 있습 경우에는 외국인 키 값을 발생한 수백 수천의 시대.이 경우,검사 것 아마도 더 나은 선택입니다.시나리오를 위해 만든 없었 행의 값으로 10.나는 아직도 생각하는 행동이 재미있고는지 알고 싶은 경우에는 이유가 있습니다.

SQL 바이올린

추가 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 이 도움이 될 수 없습니다.는 국기 도움이 되지 않으로 이단입니다,하지만.과 같은 부인 것 적용됩니다-이것은 단지 다른 것은 없는 일반적으로 하지 않고는 톤의 문서와 엄격한 회귀분 테스트 절차에는 장소입니다.

또한,서비스팩 1 는 길 밖의 지원을 받아야에 서비스 팩 3 + MS15-058.

다른 팁

변수 테이블과 temp 테이블은 다르게 처리에서 수 있습니다.가 훌륭한 여기에 해답이 의 많은 구체적인 곳으로 그들은 다릅니다.

특별히 귀하의 경우에는 내가 생각했던 것과는 사실 temp 테이블이 있을 수 있는 추가적인 통계를 생성하고 병렬 계획하는 동안 변수 테이블이 제한적 통계(열 수준을 통계)및 병렬 계획은 귀하의 원인이다.

당신은 잘 될 수 있습니다 더 나을 덤핑 테이블이 변수로 임시 테이블 기간 저장된 절차입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top