본문 바로가기

oracle

parallel 테스트. cpu 멀티코어일때 유용??

cpu처리할 때 병렬로 처리하게 해주는 기능인 듯 하다. 

검색하다가 테스트해본 결과가 있어 참고용으로 퍼옴.


1. 인덱스 생성 속도 향상 가능 옵션
- PARALLEL
- NOLOGGING


2. PARALLEL [n]
- 병렬 스레드를 이용하여 인덱스 생성을 병렬로 처리
- n (degree of parallelism): 지정하지 않으면 오라클이 n값을 선택
- 오라클이 선택하는 n값 = (the number of CPUs available on all participating instances) * (the value of the PARALLEL_THREADS_PER_CPU initialization parameter)


3. NOLOGGING
-  인덱스 생성 정보를 리두 로그 파일에 남기지 않는다


4. 과연 이러한 옵션을 사용하면 인덱스 생성 속도가 향상되는 효과가 있는가?????


5. 테스트용 데이터 준비

create table t1 (c1 int, c2 int);

insert into t1
select level, mod(level, 1000)               <--- c2 컬럼의 데이터가 c1 컬럼보다 더 불연속적
from dual
connect by level <= 1000000;

commit;


6. 테스트 방식
- trace 등 각종 분석/진단 유틸리티를 사용할 줄 모르는 관계로 brute-force(주먹구구식) 방식으로 진행
- 인덱스 생성 전과 후의 시스템의 타임스탬프 차이가 인덱스 생성 시간 ==> 정확한 시간이 아님, 그야말로 주먹구구식
- 인덱스 생성 시간을 구하고 나면 인덱스를 삭제
- 오라클 서버에 처음 접속한 상태를 만들기 위해 SQL*PLUS에서 빠져나가고 다시 SQLl*PLUS로 들어옴
- 각각의 테스트 베드에 대하여 5번을 수행한 후 평균을 구함


7. 테스트 베드
1) 옵션 없이 c1 및 c2 컬럼에 대한 인덱스 생성
2) PARALLEL 2 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
3) PARALLEL 4 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
4) PARALLEL 8 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
5) NOLOGGING 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
6) PARALLEL 4NOLOGGING 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성


8. 테스트 코드
- c1 컬럼에 대한 코드만 보이겠다.

1) 옵션 없이 c1 컬럼에 대한 인덱스 생성
select systimestamp from dual;
create index t1_c1_idx on t1(c1);
select systimestamp from dual;
drop index t1_c1_idx;

2) PARALLEL 2 적용하고 c1 컬럼에 대한 인덱스 생성
select systimestamp from dual;
create index t1_c1_idx on t1(c1) parallel 2;
select systimestamp from dual;
drop index t1_c1_idx;

3) PARALLEL 4 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
select systimestamp from dual;
create index t1_c1_idx on t1(c1) parallel 4;
select systimestamp from dual;
drop index t1_c1_idx;
<br />
4) PARALLEL 8 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
select systimestamp from dual;
create index t1_c1_idx on t1(c1) parallel 8;
select systimestamp from dual;
drop index t1_c1_idx;
<br />
5) NOLOGGING 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
select systimestamp from dual;
create index t1_c1_idx on t1(c1) nologging;
select systimestamp from dual;
drop index t1_c1_idx;
<br />
6) PARALLEL 4와 NOLOGGING 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
select systimestamp from dual;
create index t1_c1_idx on t1(c1) parallel 4 nologging;
select systimestamp from dual;
drop index t1_c1_idx;


9. 테스트 결과
- c1 컬럼
 t1(c1) no options parallel 2 parallel 4 parallel 8 nologging nologging + parallel 4
 1 2.648579 3.551217 2.916394 3.11381 2.174716 2.608722
 2 2.703154 3.497955 3.013299 3.194942 2.265965 2.643103
 3 3.131147 3.042768 3.244565 3.3221 2.2199 2.549649
 4 2.580142 3.42624 2.875428 3.210994 2.241036 2.50164
 5 3.061387 2.930799 3.152198 2.843457 2.244906 2.437199
 average 2.8248818 3.2897958 3.0403768 3.1370606 2.2293046 2.5480626

- c2 컬럼
 t1(c2) no options parallel 2 parallel 4 parallel 8 nologging nologging + parallel 4
 1 3.038661 3.239661 2.737892 2.60553  2.457146 1.990403
 2 3.093761 2.977124 2.47376  2.686759 2.241685 2.022092
 3 2.967798 3.122383 2.522444 2.585978 2.639961 2.006838
 4 2.865839 3.430903 2.473152 2.619837 2.168757 2.00592
 5 2.685428 3.026144 2.679816 2.496421 2.286793 1.995651
 average 2.9302974 3.159243 2.5774128 2.598905 2.3588684 2.0041808


10. 결론
- parallel 옵션은 일단 수치가 커지면 효과가 좋은 것으로 나타남
- parallel 값을 잘못 설정하면 오히려 결과가 좋지 않음
c1 컬럼처럼 연속적인 데이터가 다수인 경우 parallel 옵션은 큰 효과를 보지 못함
- nologging 옵션은 c1, c2 컬럼 모두에서 좋은 결과를 보여줌
- nologging 옵션의 경우 연속적인 데이터에 적용할 경우 성능 효율이 상대적으로 높음
- parallel과 nologging을 같이 사용할 경우 데이터의 연속성이 높을수록 효과가 낮다
- 데이터의 불연속성이 높은 경우 두 옵션을 함께 사용하는 것이 효과가 높다


11.  앞으로의 과제
- 주먹구구식이 아닌 정밀한 측정 도구 사용
- degree of parallelism을 오라클이 직접 선택한 경우의 결과 비교
- parallel의 값이 커질수록 효과가 좋은지 확인
- 불연속성이 좀 더 높은 데이터를 생성하여 확인