15.3. 병렬 롤 토토#

각 근로자는 완료 롤 토토의 병렬 부분을 실행하기 때문에 단순히 일반 쿼리 롤 토토을 세우고 여러 근로자를 사용하여 실행할 수 없습니다. 각 작업자는 출력 결과 세트의 전체 사본을 생성하므로 쿼리는 정상보다 빠르게 실행되지 않지만 잘못된 결과를 생성합니다. 대신, 롤 토토의 병렬 부분은 내부적으로 쿼리 최적화기에 알려진 것이되어야합니다.부분 롤 토토; 즉, 롤 토토을 실행하는 각 프로세스는 각각의 필요한 출력 행이 정확히 하나의 협력 프로세스 중 하나에 의해 생성되도록 보장되는 방식으로 출력 행의 서브 세트 만 생성하도록 구성되어야합니다. 일반적으로 이것은 쿼리 주행 테이블의 스캔이 병렬 인식 스캔이어야 함을 의미합니다.

15.3.1. 병렬 스캔#

다음 유형의 병렬 인식 테이블 스캔이 현재 지원되고 있습니다.

  • a병렬 순차적 스캔, 테이블의 블록은 범위로 나누어지고 협력 프로세스 사이에서 공유됩니다. 각 작업자 프로세스는 추가 범위의 블록을 요청하기 전에 주어진 블록 범위의 스캔을 완료합니다.

  • at병렬 비트 맵 힙 스캔, 하나의 프로세스가 리더로 선택됩니다. 이 프로세스는 하나 이상의 인덱스를 스캔하고 방문 해야하는 테이블 블록을 나타내는 비트 맵을 작성합니다. 이 블록은 병렬 순차적 스캔에서와 같이 협력 프로세스로 나뉩니다. 다시 말해, 힙 스캔은 병렬로 수행되지만 기본 색인 스캔은 아닙니다.

  • at병렬 인덱스 스캔또는병렬 인덱스 전용 스캔, 협력 프로세스는 인덱스에서 데이터를 읽습니다. 현재 병렬 인덱스 스캔은 BTREE 인덱스에 대해서만 지원됩니다. 각 프로세스는 단일 인덱스 블록을 청구하며 해당 블록에서 참조 된 모든 튜플을 스캔하고 반환합니다. 다른 프로세스는 동시에 다른 인덱스 블록에서 튜플을 반환 할 수 있습니다. 병렬 BTREE 스캔 결과는 각 작업자 프로세스 내에서 정렬 된 순서로 반환됩니다.

비트 리 인덱스 스캔과 같은 다른 스캔 유형은 향후 병렬 스캔을 지원할 수 있습니다.

15.3.2. 병렬 조인#

비 평행 계획에서와 마찬가지로, 구동 테이블은 중첩 루프, 해시 조인 또는 병합 조인을 사용하여 하나 이상의 다른 테이블과 결합 될 수 있습니다. Join의 안쪽은 평행 작업자 내에서 안전하다면 플래너가 뒷받침하는 모든 종류의 비 평행 계획 일 수 있습니다. 조인 유형에 따라 안쪽은 병렬 계획 일 수도 있습니다.

  • a중첩 루프 조인, 내부는 항상 평면이 아닌 것입니다. 외부 튜플과 인덱스에서 값을 찾는 루프가 협력 프로세스로 나뉘어지기 때문에 내부가 인덱스 스캔 인 경우 효율적입니다..

  • in합병 조인, 내부는 항상 비 평행 롤 토토이므로 전체적으로 실행됩니다. 모든 협력 과정에서 작업과 결과 데이터가 복제되기 때문에 특히 정렬을 수행 해야하는 경우에는 비효율적 일 수 있습니다.

  • in해시 조인( "평행"접두사없이) 내부는 해시 테이블의 동일한 사본을 구축하기 위해 모든 협력 프로세스에 의해 전체적으로 실행됩니다. 해시 테이블이 크거나 롤 토토이 비싸면 비효율적 일 수 있습니다. 에서병렬 해시 조인, 내부는입니다.병렬 해시협력 과정을 통해 공유 해시 테이블을 구축하는 작업을 나누는 것은

15.3.3. 병렬 응집#

PostgreSQL두 단계로 집계하여 병렬 집계를 지원합니다. 먼저, 쿼리의 병렬 부분에 참여하는 각 프로세스는 집계 단계를 수행하여 해당 프로세스의 각 그룹에 대한 부분 결과를 생성합니다. 이것은 계획에 A로 반영됩니다.부분 집계노드. 둘째, 부분 결과는 경고를 통해 리더에게 전달됩니다.수집또는합병 수집. 마지막으로, 리더는 최종 결과를 생성하기 위해 모든 근로자의 결과를 다시 분리합니다. 이것은 롤 토토에 A로 반영됩니다.집계 최종노드.

왜냐하면집계 최종노드는 리더 프로세스에서 실행됩니다. 입력 행의 수와 비교하여 비교적 많은 그룹을 생성하는 쿼리는 쿼리 플래너에게 덜 유리하게 보입니다. 예를 들어, 최악의 시나리오에서가 보이는 그룹의 수집계 최종노드는의 모든 작업자 프로세스에서 볼 수있는 입력 행의 수만큼 많을 수 있습니다.부분 집계무대. 그러한 경우, 병렬 집계를 사용하는 데는 성능 이점이 없을 것입니다. 쿼리 플래너는 롤 토토 프로세스 중에이를 고려 하고이 시나리오에서 병렬 집계를 선택하지 않을 것입니다.

병렬 집계가 모든 상황에서 지원되는 것은 아닙니다. 각 집계는이어야합니다.PostgreSQL : 문서 : 17 : 15.4. 롤 토토 안전병렬 처리의 경우 조합 기능이 있어야합니다. 집계에 유형의 전이 상태가있는 경우내부, 직렬화 및 사막화 기능이 있어야합니다. 보다집계 생성자세한 내용은. 집계 함수 호출이 포함 된 경우 병렬 집계가 지원되지 않습니다별개의또는주문 by조항은 순서 세트 집계에 대해서도 지원되지 않거나 쿼리가 포함될 때그룹화 세트. 쿼리에 관련된 모든 조인이 롤 토토의 병렬 부분의 일부일 때만 사용할 수 있습니다.

15.3.4. 병렬 부록#

언제든지postgresql여러 소스의 행을 단일 결과 세트로 결합해야합니다.부록또는MergeAppend계획 노드. 이것은 일반적으로 구현할 때 발생합니다Union All또는 분할 된 테이블을 스캔 할 때. 이러한 노드는 다른 계획에서 가능한 것처럼 병렬 계획에서 사용할 수 있습니다. 그러나 병렬 계획에서 플래너는 대신 a를 사용할 수 있습니다.병렬 부록노드.

언제Append노드는 병렬 롤 토토에 사용되며, 각 프로세스는 자식 롤 토토이 나타나는 순서대로 아동 롤 토토을 실행하여 모든 참여 프로세스가 완료 될 때까지 첫 번째 아동 롤 토토을 실행하기 위해 협력하여 동시에 두 번째 롤 토토으로 이동합니다. A병렬 부록대신에, 집행 인은 대신 참여 과정을 아동 롤 토토에 대해 가능한 한 고르게 확산시켜 여러 아동 롤 토토이 동시에 실행됩니다. 이것은 경합을 피하고 또한 그것을 실행하지 않는 프로세스에서 아동 롤 토토의 스타트 업 비용을 지불하는 것을 피합니다..

또한 일반과 달리부록노드, 병렬 롤 토토 내에서 사용될 때만 부분 어린이를 가질 수있는 노드, a병렬 부록노드는 부분적 및 비 진당 아동 계획을 모두 가질 수 있습니다. 비 진당 어린이는 단일 프로세스 만 스캔하여 스캔하면 한 번 이상 스캔하면 중복 결과가 생성되기 때문입니다. 따라서 여러 결과 세트를 추가하는 계획은 효율적인 부분 롤 토토을 사용할 수없는 경우에도 거친 입자 평행을 달성 할 수 있습니다. 예를 들어, 병렬 스캔을 지원하지 않는 인덱스를 사용하여 효율적으로 만 구현할 수있는 분할 된 테이블에 대한 쿼리를 고려하십시오. 플래너는 A를 선택할 수 있습니다.병렬 부록정기인덱스 스캔롤 토토; 각 개별 지수 스캔은 단일 프로세스로 완료되도록 실행해야하지만 다른 프로세스로 동시에 다른 스캔을 수행 할 수 있습니다.

enable_parallel_append이 기능을 비활성화하는 데 사용할 수 있습니다.

15.3.5. 병렬 롤 토토 팁#

그렇게 할 것으로 예상되는 쿼리가 병렬 롤 토토을 생성하지 않으면 감소를 시도 할 수 있습니다parallel_setup_cost또는parallel_tuple_cost. 물론,이 롤 토토은 플래너가 선호하는 일련의 롤 토토보다 느리게 될 수 있지만, 항상 그런 것은 아닙니다. 이러한 설정의 매우 작은 값으로도 병렬 롤 토토을 얻지 못하면 (예 : 두 가지 모두 설정 후) 쿼리 플래너가 쿼리에 대한 병렬 롤 토토을 생성 할 수없는 이유가있을 수 있습니다. 보다PostgreSQL : 문서 : 17 : 15.2. 병렬 토토 베이를 언제 사용할 수 있습니까?andPostgreSQL : 문서 : 17 : 15.4. 롤 토토 안전이것이 왜 그런지에 대한 정보를 보려면.

병렬 롤 토토을 실행할 때 사용할 수 있습니다설명 (분석, Verbose)각 롤 토토 노드에 대한 근로자 당 통계를 표시합니다. 이것은 모든 롤 토토 노드간에 작업이 균등하게 배포되는지 여부를 결정하는 데 유용 할 수 있으며보다 일반적으로 롤 토토의 성능 특성을 이해하는 데 유용 할 수 있습니다.

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면