7. 리두 로그의 양
대용량 DML에서는 실제 작업에 의해 발생하는 리두 로그를 기록하는 부분에 의해 성능이 저하된다. 테이블 및 인덱스 생성 옵션 중 NOLOGGING옵션이 존재한다. 해당 옵션을 설정한 후 DML 작업을 수행하면 데이터 변경에 의해 발생하는 로그는 리두 로그 버퍼에 기록하지 않게 된다. 단지 오라클 내부에서 사용하는 기본적인 로그만을 생성하게 된다. 따라서 대용량 DML에서 리두 로그의 양을 최소화하여 성능을 향상시킬 수 있게 된다. 모든 DML에 대해서 해당되는 사항은 아니며 다음과 같은 경우에 해당된다.
- 다이렉트 로딩(Direct loading) 작업(/*+ append*/, /*+ parallel*/를 사용하는 Insert작업)
- CREATE TABLE ..... AS SELECT 또는 CREATE INDEX 문
- ALTER TABLE ..... MOVE PARTITION
- ALTER INDEX ..... REBUILD PARTITION
NOLOGGING 상태로 위의 명령을 수행하게 되면 변경되는 데이터에 대한 리두 로그 정보가 기록되지 않으므로 디스크 I/O감소에 의한 수행 속도가 향상된다. NOLOGGING 옵션을 다음과 같은 방법으로 설정할 수 있다.
SQL> CREATE TABLE NAME_1 NOLOGGING AS SELECT * FROM NAME;
SQL> ALTER TABLE NAME_1 NOLOGGING;
NOLOGGING옵션을 사용하면 DML 작업과 테이블 및 인덱스 변경 작업을 보다 빠르게 수행할 수 있다. 하지만 작업에 대한 로그가 리두 로그 파일에 기록되지 않기 때문에 장애시 해당 세그먼트를 복구할 수 없다는 단점이 있게 된다. 그러므로 NOLOGGING 사용시 작업 수행 속도와 복구 가능 여부에 대한 충분한 고려가 필요하다.
8. 데이터 블록 크기와 성능
현재는 디스크의 속도가 월등히 좋아졌기 때문에 데이터 블록 크기를 어떻게 설정하는가에 따른 성능 차이는 거의 없다. 데이터 블록의 크기보다는 디스크 I/O 횟수에 의해 성능이 좌우되기 쉽다. 요즘은 대부분의 시스템이 대용량 데이터베이스로 변하고 있기 때문에 보통의 경우 데이터 블록 크기를 크게 설정하게 된다. 데이터 블록의 크기는 2,4,8,16,32 및 64KB 등으로 설정될 수 있다.
9. PCTFREE 옵션의 설정
업무 특성상 데이터 INSERT만 발생하고 UPDATE는 발생하지 않는 테이블이라면 PCTFREE 값을 0으로 설정하여 데이터 블록 공간을 보다 효율적으로 활용할 수 있을 것이다.
10. 행 이전 제거
행 이전이 많이 발생된 테이블에 대해 행 이전을 제거하기 위해서는 EXPORT/IMPORT 또는 CREATE TABLE AS SELECT 명령으로 테이블을 재구성해야한다. 테이블을 재구성하면 기존에 발생한 행 이전은 완전히 해소되므로 행 이전이 많이 발생하는 테이블에 대해서는 주기적인 테이블 재구성을 수행하여 행 이전을 해결하도록 해야 한다.
고수위(High Water Mark, HWM) : 세그먼트 생성 이후 최대 사용량을 표시하는 세그먼트 구성요소
11. 고수위와 성능
테이블에 저장된 데이터 겅수는 얼마 되지 않지만 테이블 전체 스캔을 수행하는 시간이 오래 소요되는 경우가 있다. 이것은 앞에서 언급했던 전체 스캔시 고수위 밑에 있는 모든 데이터 블록을 엑세스하기 때문이다. 이런 경우에는 EXPORT/IMPORT eHSMS CREATE TABLE AS SELECT 명령 등으로 테이블 재구성을 수행하거나 온라인 세그먼트 축소를 수행하도록 한다.
또한, 테이블의 형태만 필요할 경우 DELETE를 수행하지 말고 TRUNCATE를 수행하여 고수위 및 이미 할당된 익스텐트를 할당 해제하는 것이 좋다.
12. 다이렉트 로딩(Direct Loading)
로딩이란 데이터를 해당 테이블에 저장하는 것을 의미한다. 로딩에는 일반 로딩과 다이렉트 로딩이 존재한다. 다이렉트 로딩은 /*+ APPEND*/라는 힌트를 이용하여 INSERT를 수행하는 것으로 일반 로딩보다 빠른 성능을 보장하게 된다. 다이렉트 로딩은 고 비용의 고수위 이동을 수행하지 않고 바로 테이블에 모든 데이터를 저장하는 방법으로 다음과 같이 수행한다.
SQL> INSERT /*+ APPEND*/ INTO 사원_임시 SELECT * FROM 사원;
13. 인덱스 세그먼트 축소와 인덱스 재구성
인덱스 재구성시 여유 공간이 부족하다면 우선 먼저 인덱스 세그먼트 축소를 수행하는 것이 공간적인 면에서는 유리할 수 있다. 인덱스 세그먼트 축소 후 크기가 작아진 인덱스로 재구성을 수행한다면 보다 적은 공간으로 인덱스 재구성을 수행할 수 있다. 하지만 이경우 인덱스 재구성만을 수행하는 것보다 더 많은 작업시간이 필요하며, 인덱스 세그먼트 축소에 의한 부하가 발생 할 수 있기 때문에 많은 고려 및 테스트를 수행해야 한다.
[출처]초보자를 위한 Oracle 10g_권순용, 김지한, 황오현저