본문 바로가기

IT관련

오라클 병렬처리 Union All 성능향상 (PQ_CONCURRENT_UNION) - Oracle 12c 신기능

Oracle 12c 신기능 중에 Union 또는 Union All SQL의 성능을 개선한 부분이 있습니다.

원래 Union 이나 Union All 구문의 처리는 Union 으로 묶여있는 각각의 SQL을 1개씩 Serial 하게 처리합니다. 이게 Oracle 12.1 버전부터는 동시에 처리되도록 바뀌었습니다. 단, 병렬처리의 경우에 한정입니다.

이전버전에서는 PQ_CONCURRENT_UNION 이라는 힌트를 별도로 주어서 이런 기능이 구현되었었는데, 12c 부터는 자동으로 Default 적용됩니다.

 

왼쪽은 optimizer_features_enable 파라메타를 조정해서 11g 환경으로 세팅한 것이고, 오른쪽은 19c 환경입니다.

똑같은 Union all SQL문을 양쪽에서 실행했는데, 왼쪽(11g)은 1.63초가 걸렸고, 오른쪽(19c)은 0.55초가 걸렸습니다.

 

 

물론, 12c 에서 추가된 PX SELECTOR 효과 (BUFFER SORT 오버헤드 제거) 도 있습니다.

여기에 더해 Union All 각각의 서브 SQL들을 동시에(Concurrent) 처리함으로써 성능이 크게 향상된 것입니다.

 

위에서 실행된 SQL은 처음 서브SQL만 parallel 이 지정되었고, 나머지 3개의 서브SQL들은 Serial 하게 실행되어야 하는 상황입니다.

 

select count(*) from (
  select /*+ parallel(a,4) */ * from EMP_BIG a
  union all
  select * from EMP_BIG b
  union all
  select * from EMP_BIG c
  union all
  select * from EMP_BIG d
);

 

하지만, 12c 이상부터는 이런 경우 4개의 서브 SQL 모두 parallel 4 로 처리됩니다.

 

SQL 모니터로 조회해보면 이를 명확히 확인할 수 있습니다.

 

 

위의 경우는 11g 에서 실행한 것으로, QC 가 Serial 처리를 모두 도맡아 하면서 Buffer Gets 값이 매우 큰 것을 확인할 수 있습니다.

반면, 19c 에서는 QC 의 Buffer Gets 는 매우 작고, 대신 Parallel Processor 들의 Buffer Gets 값이 크게 증가한 것을 확인할 수 있습니다.

 

 

아래와 같이 서브 SQL 들중에 병렬도가 더 높은게 있으면 그 높은 값을 기준으로 모든 서브 SQL들이 실행됩니다.

 

select count(*) from (
  select /*+ parallel(a,4) */ * from EMP_BIG a
  union all
  select * from EMP_BIG b
  union all
  select /*+ parallel(c,6) */ * from EMP_BIG c
  union all
  select * from EMP_BIG d
);

 

즉, a,b,c,d 4번 모두 병렬도 6으로 Reading 작업이 실행되게 됩니다.

 

 

참고 ▶▶▶ 오라클 병렬처리 종합페이지