* Parallel 인덱스 생성 방법 ===========================
1. 소개 인덱스를 만드는 CREATE INDEX명령은 다음과 같은 순서로 작업을 하게 된다. 1. 메타 데이터 처리 2. 인덱스 이름에 락을 검 3. 레코드의 인덱스 컬럼을 순차적으로 검색 4. 인덱스 컬럼을 소팅 5. 인덱스 구축(여러 저장영역으로 분산되어있는 파티션포함) 6. 신규 메타데이터를 디스크의 Rdb Root file에 Write
위의 순서중에서 다른 인덱스 생성작업을 방해하는 단계는 6번째 작업으로서, 다른 갱신된 테이블처럼 시스템 테이블 및 인덱스에 락을 걸기 때문이다.
2. Shared Data Definition 트랜잭션
동일 테이블에 대해 동시에 여러개의 인덱스를 생성하기 위해서는 인덱스를 생성하는 트랜잭션을 Reserving절과 함께 SHARED DATA DEFINTION으로 선언함 으로서 가능해진다. SHARED DATA DEFINITION트랜잭션을 최적으로 사용하기 위 해서는 다음과 같은 사항을 고려해야 한다.
2-1. CREATE INDEX명령을 사용하여 인덱스가 생성된 직후에 COMMIT명령으로 해당 테이블이나 시스템 테이블 및 인덱스에 걸린 락을 바로 릴리즈해 야 한다. 이것은 다른 인덱스 생성 프로세스와 락 충돌을 피할 수 있는 확률을 높히게 되어 병렬로 인덱스를 생성하는 작업이 빠른 시간안에 끝날 수 있게 한다.
2-2. 각 인덱스 생성 프로세스마다 적절한 SORTWORK 파일을 지정하는 논리명 을 정의해라. 이것은 인덱스 생성에 필수적인 소트작업의 성능을 높히는 데 필수적이며, 각 SORTWORK파일을 서로 다른 디스크에 지정해라.
2-3. 가능하면,글로벌 버퍼링을 설정하고 프로세스당 버퍼수를 테이블의 데이터를 수용할 수 있을 정도로 충분히 할당하라. 주의해야할 점은 글로벌 버퍼를 시스템이 보유하고 있는 물리적 메모리보다 크게 해서는 가상 페이징으로 인하여 성능이 떨어질 수 있다는 것이다. 글로벌 버퍼 는 데이터베이스내의 페이지들을 여러 프로세스가 공유할 수 있게 하여 결과적으로 디스크 I/O 수를 줄이는 효과를 내게 된다.
2-4. 글로벌 버퍼링을 설정하기가 곤란하다면, 로컬 버퍼의 수를 RDM$BIND_BUFFERS 논리명을 이용하여, 가능한 크게 설정하라. 이것은 인덱스 캐쉬를 크게 하여 전체적인 성능을 좋게 한다.
2-5. 동일 테이블의 각 인덱스에 대한 저장 영역은 서로 다른 디스크에 위치 하게 해라. 이것은 디스크의 Load Balancing을 유도하여 성능을 좋게 한다. 여러개의 인덱스를 하나의 저장 영역에 저장하는 것은 SPAM 페이지의 Contention으로 인해 성능이 떨어짐을 주의해라
2-6. 병렬로 인덱스를 생성하는 각 프로세스의 RUJ파일 위치를 각기 다른 디스크에 두거나, 자주 사용되지 않는 디스크에 둬라. 테이블이 크면 클수록 RUJ파일도 커지게 되며 RUJ파일의 확장으로 인한 디스크 Contention을 줄일 수 있기 때문이다.
2-7. SHARED DATA DEFINITION트랜잭션이 특정 테이블에 대해 작업을 시작 하면,처음에는 SHARED READ로 락이 걸리게 되며, 인덱스 생성시에은 SHARED WRITE로 락이 걸리게 되는데, SHARED WRITE 모드는 SNAPSHOT 파일에 BEFORE이미지를 기록하게 한다. 비록, SNAPSHOT파일에는 비동기 적으로 BEFORE이미지가 기록되긴 하지만, 인덱스 생성시에는 데이터 베이스의 SNAPSHOT 모드를 DISABLE로 하는 것도 바람직하다.
2-8. 각 프로세스의 워킹셋 파라미터인 WSQUOTA와 WSEXTENT의 값이 현격히 차이나게 하는 것은 바람직하지 않다. 이 2가지 파라미터의 차이만큼 의 워킹셋 페이지는 Open VMS SORT유틸리티가 Scratch virtual Memory를 할당하는데 사용되는데, 차이가 크면 클수록 과다한 Page Fault를 일으킬 수 있다. 즉 요구한 가상메모리가 사용가능한 물리적 메모리를 전체적으로 초과하는 현상이 발생하게 된다.
2-9. SHARED DATA DEFINTION 트랜잭션은 Single-file 데이터베이스나 RDB$SYSTEM에 있는 테이블에 대한 병렬 인덱스 생성은 피하는 것이 좋다.
3. 병렬 인덱스 생성에 소요되는 시간에 대한 예
아래의 예는 동일 테이블에 대해 10개의 인덱스를 동시에 생성하는 경우와 하나의 프로세스가 10개의 인덱스를 순차적으로 생성한 경우에 소요되는 시간에 대한 결과이다. 이 예에서는 테이블의 CARDINALITY는 21000개였고, 글로벌 버퍼가 설정되었으며, 한 사용자당 사용가능한 글로벌 버퍼의 수은 500 페이지 였다. 인덱스는 파티션되지 않았으며, uniform포맷의 2개의 저장영역중 하나에 생성하였다.
병렬 생성 소요 시간 ========================+====================== index1 00:02:22.50 index2 00:01:57.94 index3 00:02:06.27 index4 00:01:34.53 index5 00:01:51.96 index6 00:01:27.57 index7 00:02:34.64 index8 00:01:40.56 index9 00:01:34.43 index10 00:01:47.44 =======================+======================= 순차적 생성 소요시간 =============================================== index1 - index10 00:03:26.66 ===============================================
병령생성시에 가장 오래걸린 인덱스 생성시간은 02:34.64이고 순차적 생성의 총 소요시간은 03:26.66으로 약 1분 가량이 병렬생성으로 절약한 시간이다.
출처:http://211.106.111.2:8880/bulletin/list.jsp?seq=11259&pg=0&sort_by=last_updated&keyfield=subject&keyword=PARALLEL |