지난번 포스팅에서 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로 바꿔주는 것을 잊지 말아야 겠습니다.
참고 ▶▶▶ 오라클 병렬처리 종합페이지
'IT관련' 카테고리의 다른 글
오라클 에러 정보 (ORA-06532, ORA-06533) - PL/SQL에서 Arrary(배열) 범위를 벗어난 경우 (0) | 2020.12.01 |
---|---|
(솔라리스 19c DB 설치시 에러) pkg list: no packages matching 'oracle-database-preinstall-19c' known (0) | 2020.11.28 |
오라클 에러 정보 (ORA-01144) - 데이터파일 최대크기를 초과한 경우 (0) | 2020.10.29 |
오라클 테이블, 인덱스 압축 OLTP Compress 테스트 (ACO 옵션) (0) | 2020.10.26 |
ASM 구성시 LUN 크기, 갯수가 성능에 미치는 영향 (0) | 2020.10.21 |