본문 바로가기

IT관련

오라클 병렬처리(Parallel Processing)관련 주의사항 (의도하지 않은 병렬수행, default degree)

지난번 포스팅에서 Table 에 설정된 degree 값을 주의깊게 봐야한다고 설명드린 적이 있는데, 그 값이 특정 숫자가 아니라 "default" 라고 되어 있는 경우도 주의가 필요합니다.

 

아래와 같이 TEST_X1 테이블에 degree 값이 "default" 로 되어 있는 것을 확인할 수 있습니다.

 

이 default 의 의미가 위험합니다.

병렬처리에서 default 값은 cpu_count x parallel_threads_per_cpu 로 계산됩니다.

저는 테스트서버로 cpu_count 값이 4밖에 안되지만, 실제 운영시스템의 경우는 보통 24, 48, 96 정도로 꽤 큰 값입니다.

여기에 x 2 (parallel_threads_per_cpu) 를 하기때문에, 아주 많은 병렬프로세스를 띄우게 되는 불상사가 벌어질 수 있습니다.

 



SQL> show parameter cpu
cpu_count                            integer     4
parallel_threads_per_cpu             integer     2
resource_manager_cpu_allocation      integer     4

 

아래와 같이 parallel 힌트가 없는 SQL 문을 실행하는 경우에도 자동으로 parallel processing 을 하게 됩니다.

그것도 병렬 최대치로...

 



SQL> select /*+ monitor */ count(*)
from TEST_X1 a, TEST_X2 b
where a.empno = b.empno
;

 

참고로, 위에 /*+ monitor */ 힌트는 parallel 과 관계없는 힌트입니다.^^

SQL Monitoring Report 를 뜨기 위해서 사용한 힌트입니다.

 

아래 Report 를 보면, DOP=8, Server는 16개가 사용된 것을 확인할 수 있습니다.

 

default DOP 가 8 인데, 두 테이블을 Join 했기 때문에 2배의 병렬프로세스가 기동되어 처리를 한 것입니다.

 

만약, 운영시스템에서 cpu 가 48 core 이고, parallel_threads_per_cpu = 2 로 되어 있다면,

DOP는 96 이 되는 것이고, 저런식으로 Join SQL 문이 돌면, 192 개의 프로세스가 기동된다는 말이 됩니다.

이런식의 SQL 이 딱 한번만 실행된다는 보장을 할 수 없죠~~ 운영 시스템은 워낙 동시다발적으로다가 사용되기 때문에...   느닷없이 500개, 1000개의 프로세스가 기동되어 돌아갈 수도 있다는 얘기~~ 뜨악

 

USER_TABLES 에서 degree 값을 조회해서 default 로 되어있는 녀석들은 1 로 바꿔놓는게 정신건강에 좋습니다.

degree 가 1로 되어 있어도, SQL문에서 /*+ parallel(n) */ 힌트를 주면 병렬로 수행됩니다.

 

Table 에 degree 값이 default 로 세팅되는 경우는,

CTAS 등으로 테이블을 생성할 때 "숫자 지정없이 parallel 키워드만 사용" 했을 때 이렇게 세팅되게 됩니다.

 

초기에 테이블 생성시 작업을 빠르게 하기위해 parallel 처리로 만들었다면, 작업끝나고 반드시 degree 값을 1로 바꿔주는 것을 잊지 말아야 겠습니다.

 

 

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