각 작업자는 완료 롤 토토의 병렬 부분을 실행하기 때문에 단순히 일반 쿼리 롤 토토을 세우고 여러 근로자를 사용하여 실행할 수 없습니다. 각 작업자는 출력 결과 세트의 전체 사본을 생성하므로 쿼리는 정상보다 빠르게 실행되지 않지만 잘못된 결과를 생성합니다.부분 롤 토토; 즉, 롤 토토을 실행하는 각 프로세스는 각각의 필요한 출력 행이 정확히 하나의 협력 프로세스 중 하나에 의해 생성되도록 보장되는 방식으로 출력 행의 서브 세트 만 생성하도록 구성되어야합니다.
다음 유형의 병렬 인식 테이블 스캔이 현재 지원되고 있습니다.
at병렬 순차적 스캔, 테이블의 블록은 범위로 나뉘어 협력 프로세스 사이에서 공유됩니다. 각 작업자 프로세스는 추가 범위의 블록을 요청하기 전에 주어진 블록 범위의 스캔을 완료합니다.
at병렬 비트 맵 힙 스캔, 하나의 프로세스가 리더로 선택됩니다. 이 프로세스는 하나 이상의 인덱스를 스캔하고 방문 해야하는 테이블 블록을 나타내는 비트 맵을 작성합니다.
at병렬 인덱스 스캔또는병렬 인덱스 전용 스캔, 협력 프로세스는 인덱스에서 데이터를 읽습니다. 현재 병렬 인덱스 스캔은 BTREE 인덱스에 대해서만 지원됩니다.
비트 리 인덱스 스캔과 같은 다른 스캔 유형은 향후 병렬 스캔을 지원할 수 있습니다.
비 평행 계획에서와 마찬가지로, 구동 테이블은 중첩 루프, 해시 조인 또는 병합 조인을 사용하여 하나 이상의 다른 테이블과 결합 될 수 있습니다. Join의 안쪽은 평행 작업자 내에서 안전하다면 플래너가 뒷받침하는 모든 종류의 비 평행 계획 일 수 있습니다.
at중첩 루프 조인, 내부는 항상 평면이 아닌 것입니다. 외부 튜플과 인덱스에서 값을 찾는 루프가 협력 프로세스로 나뉘어지기 때문에 내부가 인덱스 스캔 인 경우 효율적입니다..
at합병 조인, 내부는 항상 비 평면 롤 토토이므로 전체적으로 실행됩니다. 모든 협력 과정에서 작업과 결과 데이터가 복제되기 때문에 특히 정렬을 수행 해야하는 경우에는 비효율적 일 수 있습니다.
at해시 조인( "평행"접두사없이) 내부는 해시 테이블의 동일한 사본을 구축하기 위해 모든 협력 프로세스에 의해 전체적으로 실행됩니다. 해시 테이블이 크거나 롤 토토이 비싸면 비효율적 일 수 있습니다.병렬 해시 조인, 내부는입니다.병렬 해시협력 프로세스를 통해 공유 해시 테이블을 구축하는 작업을 나누는 것은
postgresql두 단계로 집계하여 병렬 집계를 지원합니다. 먼저, 쿼리의 병렬 부분에 참여하는 각 프로세스는 집계 단계를 수행하여 해당 프로세스의 각 그룹에 대한 부분 결과를 생성합니다.부분 집계
노드. 둘째, 부분 결과는 경고를 통해 리더에게 전달됩니다.수집
또는합병 수집
. 마지막으로, 리더는 최종 결과를 생성하기 위해 모든 근로자의 결과를 다시 분리합니다.골재 마무리
노드.
왜냐하면골재 마무리
노드는 리더 프로세스에서 실행됩니다. 입력 행의 수와 비교하여 비교적 많은 그룹을 생성하는 쿼리는 쿼리 플래너에게 덜 유리하게 보입니다. 예를 들어, 최악의 시나리오에서가 보이는 그룹의 수골재 마무리
노드는의 모든 작업자 프로세스에서 볼 수있는 입력 행의 수만큼 많을 수 있습니다.부분 집계
무대. 그러한 경우, 병렬 집계를 사용하는 데는 성능 이점이 없을 것입니다.
병렬 집계가 모든 상황에서 지원되는 것은 아닙니다. 각 집계는이어야합니다.PostgreSQL : 문서 : 17 : 15.4. 롤 토토 안전병렬 처리의 경우 조합 기능이 있어야합니다. 집계에 유형의 전이 상태가있는 경우내부
, 직렬화 및 사막화 기능이 있어야합니다. 보다집계 생성자세한 내용. 집계 함수 호출이 포함 된 경우 병렬 집계가 지원되지 않습니다별도의
또는주문 by
조항은 주문 세트 집계에 대해서도 지원되지 않거나 쿼리가 포함될 때그룹화 세트
. 쿼리에 관련된 모든 조인이 롤 토토의 병렬 부분의 일부일 때만 사용할 수 있습니다.
언제든지postgresql여러 소스의 행을 단일 결과 세트로 결합해야합니다.부록
또는mergeappend
계획 노드. 이것은 일반적으로 구현할 때 발생합니다Union All
또는 파티션 된 테이블을 스캔 할 때. 이러한 노드는 다른 계획에서 가능한 것처럼 병렬 계획에서 사용할 수 있습니다.병렬 부록
노드.
언제부록
노드는 병렬 롤 토토에 사용되며, 각 프로세스는 어린이 롤 토토이 나타나는 순서대로 자식 롤 토토을 실행하여 모든 참여 프로세스가 완료 될 때까지 첫 번째 아동 롤 토토을 실행하기 위해 협력하여 동시에 두 번째 롤 토토으로 이동합니다. A병렬 부록
대신에, 집행 인은 대신 참여 과정을 아동 롤 토토에 대해 가능한 한 고르게 확산시켜 여러 아동 롤 토토이 동시에 실행됩니다. 이것은 경합을 피하고 또한 그것을 실행하지 않는 프로세스에서 아동 롤 토토의 스타트 업 비용을 지불하는 것을 피합니다..
또한 일반과 달리부록
노드, 병렬 롤 토토 내에서 사용할 때만 부분 어린이를 가질 수있는 노드, a병렬 부록
노드는 부분적 및 비 임파 아동 롤 토토을 모두 가질 수 있습니다. 비 진당 어린이는 단일 프로세스 만 스캔하여 스캔하면 한 번 이상 스캔하면 중복 결과가 생성되기 때문입니다.병렬 부록
정기인덱스 스캔
롤 토토; 각 개별 지수 스캔은 단일 프로세스로 완료되도록 실행해야하지만 다른 프로세스로 동시에 다른 스캔을 수행 할 수 있습니다.
enable_parallel_append이 기능을 비활성화하는 데 사용할 수 있습니다.
그렇게 할 것으로 예상되는 쿼리가 병렬 롤 토토을 생성하지 않으면 감소를 시도 할 수 있습니다parallel_setup_cost또는parallel_tuple_cost. 물론,이 롤 토토은 플래너가 선호하는 일련의 롤 토토보다 느리게 될 수 있지만, 항상 그런 것은 아닙니다.섹션 15.2및PostgreSQL : 문서 : 17 : 15.4. 롤 토토 안전이것이 왜 그런지에 대한 정보를 보려면.
병렬 롤 토토을 실행할 때 사용할 수 있습니다설명 (분석, Verbose)
각 롤 토토 노드에 대한 직원 당 통계를 표시합니다. 이것은 모든 롤 토토 노드간에 작업이 균등하게 배포되는지 여부를 결정하는 데 유용 할 수 있으며보다 일반적으로 롤 토토의 성능 특성을 이해하는 데 유용 할 수 있습니다.
문서에 맞지 않는 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면