SQL에서 두 개의 큰 데이터 세트를 비교하는 효율적인 방법


12

현재 고유 한 StoreKey/ProductKey조합 을 포함하는 두 개의 데이터 세트를 비교하고 있습니다 .

첫 번째 데이터 세트는 StoreKey/ProductKey2012 년 1 월 시작과 2014 년 5 월 말 사이에 고유 한 판매 조합 (결과 = 450K 회선)을 갖습니다 . 두 번째 데이터 세트는 StoreKey/ProductKey2014 년 6 월에 시작하여 오늘까지 (결과 = 190K 라인) 고유 한 조합을 갖습니다 .

나는 StoreKey/ProductKey두 번째 세트에 있지만 첫 번째 세트에는없는 조합을 찾고 있습니다. 즉 6 월 초부터 판매되는 신제품입니다.

지금까지 두 개의 데이터 세트를 임시 테이블에 덤프하고 두 키 모두에 대한 두 테이블에 대한 인덱스를 작성하고 EXCEPT명령문을 사용하여 고유 한 항목을 찾았습니다.

이러한 큰 데이터 세트를 비교하는 가장 효율적인 방법은 무엇입니까? 이 유형의 큰 비교를 수행하는보다 효율적인 방법이 있습니까?

답변:


10

EXCEPT를 사용하는 것이 여기에가는 길이지만 임시 테이블의 사용을 재고하고 싶을 수도 있습니다. 이렇게하면 데이터를 메모리에 효과적으로 복제 할 수있어 속도가 느려집니다. 필요한 인덱스가 소스 테이블에 존재하면 (필자가 생각하는 것처럼) 적절한 SELECTS를 비교하십시오.

SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4

1
테이블에는 인덱스가 있지만 두 개의 필수 필드와 TransactionDateKey라는 필드에 대한 클러스터형 인덱스입니다. a.) StoreKey 및 ProductKey에 대한 클러스터형 인덱스 b.) StoreKey 및 ProductKey에 각각 별도의 비 클러스터형 인덱스가 있습니까?
Pierre Pretorius

1
TransactionDateKey기간을 필터링하는 데 사용되는 열 이라고 가정 합니다. 이 경우 클러스터 된 인덱스 TransactionDateKey, StoreKey그리고 ProductKey완벽합니다.
Twinkles

1

알고리즘 (Big-O 복잡성)에 익숙한 경우이 비교를 수행하는 것이 최상의 O (n log (n))입니다. 가장 효율적인 알고리즘은 두 데이터 세트를 정렬 한 다음 병합 된 런을 병렬로 만들어 일치하는 (또는 일치하지 않는) 키를 찾습니다. 당신이 사용하는 경우 대부분의 RDBMS 옵티마이 저는 당신을 위해 자동으로 수행됩니다 EXCEPT또는 MINUS. 귀하의 Explain Plan은 확인 또는 불신합니다. 중첩 루프가 보이면 효율적이지 않은 O (n ^ 2)를 수행하는 것입니다.


감사합니다. Big-O 복잡성에 익숙하지는 않지만 확실히 살펴볼 것입니다.
Pierre Pretorius

일부 사람들은 구어체를 Big-O라고 부르는 Complexity Analysis에 대한 자세한 정보를 제공합니다. 처음 보는 것만 큼 힘들지는 않습니다. 사람들이 작업이 선형 시간 또는 다항식 시간으로 실행될 것이라고 말하면 이것이 그들이 말하는 것입니다. 데이터베이스 백업은 일반적으로 선형이므로 2x 데이터베이스 크기는 백업하는 데 2x 시간이 걸립니다. 데이터를 정렬하면 선형이 아닙니다. 2 배 큰 파일은 정렬하는 데 2 ​​배 이상의 시간이 걸립니다. bigocheatsheet.com , 위키 en.wikipedia.org/wiki/Time_complexity에서 가능한 가장 빠른 비교 정렬은 "linearithmic time"= n log (n)입니다.
Joshua Huber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.