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