해시 조인과 병합 조인 (Oracle RDBMS)의 차이점은 무엇입니까?
특히 Oracle RDBMS에서 해시 조인과 병합 조인 간의 성능 향상 / 손실은 무엇입니까?
"정렬 병합"조인은 조인 키에 따라 조인 할 두 데이터 세트를 정렬 한 다음 함께 병합하여 수행됩니다. 병합은 매우 저렴하지만 특히 정렬이 디스크로 유출되는 경우 정렬 비용이 엄청나게 비쌀 수 있습니다. 인덱스를 통해 정렬 된 순서로 데이터 세트 중 하나에 액세스 할 수있는 경우 정렬 비용을 낮출 수 있지만 인덱스 스캔을 통해 테이블의 많은 블록에 액세스하는 것도 전체 테이블 스캔에 비해 매우 비쌀 수 있습니다. .
해시 조인은 조인 열을 기반으로 한 데이터 세트를 메모리로 해시하고 다른 열을 읽고 해시 테이블에서 일치 항목을 검색하여 수행됩니다. 해시 조인은 해시 테이블을 완전히 메모리에 보관할 수있을 때 비용이 매우 저렴하며 총 비용은 데이터 세트를 읽는 데 드는 비용보다 조금 더 많습니다. 해시 테이블을 1 회 통과 정렬로 디스크로 넘겨야하는 경우 비용이 증가하고 다중 통과 정렬의 경우 상당히 증가합니다.
(10g 이전에서는 옵티마이 저가 해시 조인의 경우 먼저 작은 테이블에 액세스해야하는 필요성을 해결할 수 없었지만 외부 조인의 경우 더 큰 테이블에 먼저 액세스해야하므로 큰 테이블에서 작은 테이블로의 외부 조인은 성능 측면에서 문제가있었습니다. 따라서이 상황에서는 해시 조인을 사용할 수 없습니다.
해시 조인 비용은 조인 키에서 두 테이블을 분할하여 줄일 수 있습니다. 이를 통해 옵티마이 저는 한 테이블에있는 파티션의 행이 다른 테이블의 특정 파티션에서만 일치하는 항목을 찾고 n 개의 파티션이있는 테이블의 경우 해시 조인이 n 개의 독립 해시 조인으로 실행된다는 것을 추론 할 수 있습니다. 다음과 같은 효과가 있습니다.
- 각 해시 테이블의 크기가 줄어들 기 때문에 필요한 최대 메모리 양이 줄어들고 작업에 임시 디스크 공간이 필요하지 않을 수 있습니다.
- 병렬 쿼리 작업의 경우 각 해시 조인이 한 쌍의 PQ 프로세스에서 수행 될 수 있으므로 프로세스 간 메시징의 양이 크게 줄어들어 CPU 사용량이 줄어들고 성능이 향상됩니다.
- 비 병렬 쿼리 작업의 경우 메모리 요구 사항이 n 배 감소되고 첫 번째 행이 쿼리에서 더 일찍 프로젝션됩니다.
해시 조인은 동등 조인에만 사용할 수 있지만 병합 조인은 더 유연합니다.
일반적으로 동등 조인으로 많은 양의 데이터를 조인하는 경우 해시 조인이 더 나은 선택이 될 것입니다.
이 주제는 문서에서 매우 잘 다루어집니다.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
12.1 문서 : https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm
이 질문에 답할 때 oracle 태그가 추가되지 않은 후손을 위해 이것을 편집하고 싶습니다. 내 응답은 MS SQL에 더 적합했습니다.
병합 조인은 순서를 활용하여 테이블을 단일 전달하여 조인을 수행하므로 가능한 가장 좋습니다. 기본 키와 해당 키에 대한 테이블의 인덱스와 같이 순서가 동일한 두 개의 테이블 (또는 포함 인덱스)이있는 경우 해당 작업을 수행하면 병합 조인이 발생합니다.
해시 조인은 일반적으로 한 테이블에 (상대적으로) 항목 수가 적을 때 수행되므로 효과적으로 각 행에 대한 해시가있는 임시 테이블을 생성하고 조인을 생성하기 위해 계속 검색합니다.
최악의 경우는 순서 (n * m) 인 중첩 루프입니다. 이는 악용 할 순서 나 크기가 없음을 의미하며 조인은 단순히 테이블 x의 각 행에 대해 조인 할 테이블 y를 검색하는 것입니다.
'Development Tip' 카테고리의 다른 글
ASP.NET에서 XML을 반환하는 방법은 무엇입니까? (0) | 2020.12.25 |
---|---|
왜 기본 기능보다 PHP OOP를 사용합니까? (0) | 2020.12.25 |
이미지에서 로고 인식 (0) | 2020.12.25 |
Java의 파일 이름이 공용 클래스 이름과 동일한 이유는 무엇입니까? (0) | 2020.12.25 |
try {} catch {}와 if {} else {}의 장점은 무엇입니까? (0) | 2020.12.15 |