cpu처리할 때 병렬로 처리하게 해주는 기능인 듯 하다.
검색하다가 테스트해본 결과가 있어 참고용으로 퍼옴.
1. 인덱스 생성 속도 향상 가능 옵션
2. PARALLEL [n]
3. NOLOGGING
6. 테스트 방식
8. 테스트 코드
9. 테스트 결과
11. 앞으로의 과제
- 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 4와 NOLOGGING 적용하고 c1 및 c2 컬럼에 대한 인덱스 생성
- 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을 같이 사용할 경우 데이터의 연속성이 높을수록 효과가 낮다
- 데이터의 불연속성이 높은 경우 두 옵션을 함께 사용하는 것이 효과가 높다
- 주먹구구식이 아닌 정밀한 측정 도구 사용
- degree of parallelism을 오라클이 직접 선택한 경우의 결과 비교
- parallel의 값이 커질수록 효과가 좋은지 확인
- 불연속성이 좀 더 높은 데이터를 생성하여 확인
'oracle' 카테고리의 다른 글
tablespace에 대한 고찰!! (0) | 2017.01.10 |
---|---|
오라클 테이블스페이스 용량 늘리기 tablespace (0) | 2016.10.21 |
create table as select 다시 한번 상기하자!! (0) | 2016.10.20 |
pl/sql 프로그램에서 사용할 수 있는 문자 집합 (0) | 2016.10.14 |
DBMS_OUTPUT 패키지 (0) | 2016.10.14 |