SQL Server 2012에서 두 개의 큰 결과 집합을 비교하는 가장 효율적인 방법


9

두 개의 큰 결과 / 행 세트를 비교하는 가장 효율적인 방법에 대한 현재 조언은 EXCEPT연산자 를 사용하는 것 같습니다 . 아래의이 자체 포함 SQL 스크립트는 행 크기가 증가함에 따라 매우 비효율적입니다 (@last 값 변경). 결합 된 테이블에서 고유 한 항목을 찾으려고했지만 개선되지 않았습니다.

DECLARE @first AS INT, @step AS INT, @last AS INT; 

-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible

-- Compare 100 to 110 rows - 0 seconds
-- Compare 1000 to 1010 rows - 1 seconds
-- Compare 10000 to 10010 rows - 16 seconds
-- Compare 100000 to 100010 rows - ABORT after 8 minutes (tables are populated in 18 seconds)

DECLARE @temptableOLD TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100000
WHILE(@first <= @last) BEGIN INSERT INTO @temptableOLD VALUES(@first) SET @first += @step END

DECLARE @temptableNEW TABLE ([Result1] int);
SET @step = 1;  SET @first = 1; SET @last = 100010
WHILE(@first <= @last) BEGIN INSERT INTO @temptableNEW VALUES(@first) SET @first += @step END

select * from @temptableNEW
except
select * from @temptableOLD

답변:


8

EXCEPTDISTINCT작업을 의미합니다 .

NOT EXISTS이것이 실제로 필요하지 않은 경우 사용 합니다.

그러나 발생하는 문제는 테이블 변수와 관련된 카디널리티 추정이 잘못되어 인덱싱되지 않은 테이블에서 중첩 루프를 얻는 것일 수 있습니다.

select * from @temptableNEW
except
select * from @temptableOLD
OPTION (RECOMPILE)

테이블에 각각 100K 개의 행이 있고 다른 계획을 제공 할 수 있습니다.

SQL Server 2012에서는 제약 조건을 통해서만 테이블 변수에 인덱스를 추가 할 수 있습니다. 값이 고유하면 사용할 수 있습니다

DECLARE @temptableOLD TABLE ([Result1] int UNIQUE CLUSTERED);

색인을 추가합니다. 두 테이블 모두에서 수행 된 경우 계획 (재 컴파일 힌트 추가 후)은 병합 조인을 대신 사용합니다. 인덱스가 없으면 해시 조인이 필요합니다.


고마워 마틴 이것이 답입니다. OPTION (RECOMPILE)이 도움이되었지만 (5 분에 100,000), 두 테이블에서 UNIQUE CLUSTERED가 크게 향상되었습니다 (7 초에 100,000) !!! 두 개의 다른 SQL Server에서 테이블 인덱싱을 제어 할 수없는 실제 문제를 설명하기 위해이 테이블 만 만들었지 만 이러한 테이블 변수를 통해 관리 할 것입니다.
Will Healey

4
@WillHealey #temp테이블은 테이블 변수 (통계, 병렬 처리,보다 유연한 인덱싱)에 비해 많은 장점이 있으므로 테이블 변수로 제한된 컨텍스트에서 이것을 사용하지 않으면 시도 할 수 있습니다.
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.