두 개의 큰 목록 (1 억 항목 일 수 있음)이 있으며, 각 목록의 원본은 데이터베이스 테이블이나 플랫 파일에서 가져올 수 있습니다. 두리스트는 비교할 수없는 크기이며 둘 다 정렬되지 않습니다. 나는 그들 사이의 차이점을 찾아야한다. 그래서 나는 3 가지 시나리오를 가지고 있습니다 :
1. List1은 데이터베이스 테이블입니다 (각 행은 단순히 하나의 항목 (키)가 문자열이라고 가정합니다). List2는 큰 파일입니다.
2. 두 목록은 모두 2 db 테이블에 있습니다.
3. 두 목록은 두 개의 파일에 있습니다. 경우 2두 개의 매우 큰 목록 간의 차이점을 찾으십시오.
, 내가 사용할 계획 :
select a.item from MyTable a where a.item not in (select b.item form MyTable b)
이 분명 비효율적 더 좋은 방법이 있나요?
또 다른 방법은 다음과 같습니다
나는 각 목록을 정렬 한 다음은 diff를 찾기 위해 둘을 걸어 할 계획입니다. 목록이 파일에서 온 것이면 먼저 db 테이블로 읽은 다음 db sorting을 사용하여 목록을 출력해야합니다. 실행 시간 복잡도가 여전히 데이터베이스 정렬에서 O (nlogn)입니까?
어떤 접근 방식이든 고통스럽고 관련된 목록에 수억 개의 항목이있는 경우 매우 느립니다. 어떤 제안?
+1 유일한 정답입니다.DB는 100 만 가지 행을 말할 때 이렇게 만들어지지 않았고 성능이 좋지 않았습니다. 나의 가장 재미있는 프로젝트 중 하나는 Mitch가 여기서 설명하는 것과 똑같이 작동하는 직접 마케팅을위한 병합 시스템을 작성하는 것이 었습니다. –
이것은 단순한 db 왼쪽 조인 (Chri의 대답)보다 구현하기가 훨씬 어렵습니다. MyTable에서 a.item 선택 LEFT JOIN MyTable B ON A.JoinColumn = B.JoinColumn B.JoinColumn은 NULL이지만 어떤 경우에도 db sorting은 유닉스 정렬 유틸리티 나 내 응용 프로그램에서 정렬하는 것보다 더 효율적이지 않습니까? – user157195