본문 바로가기
OraclE

SQL*LOADER 성능 향상 기법

by 타마마임팩트_쫀 2010. 5. 25.



============================
SQL*LOADER 성능 향상 기법
============================
 
    PURPOSE
    ---------
    이 문서는 SQL*LOADER 사용시 성능 향상 기법에 대해서 설명한다.

    Explanation
    -----------
    1. 테이블에 인덱스가 걸려있을 경우, 먼저 인덱스를 drop 시키고, SQL*Loader로
      데이터를 올린 후 index를 생성한다.
      1) 데이터를 로딩하는 동안 rollback 과 redo log의 양을 줄일 수 있다.
      2) B*Tree가 잘 balance 된다.
      중복된 데이터가 있는지 여부를 확인하기 위해서 index를 drop 시키지
      못하는 경우도 있다.
    2. 데이터를 로딩하기 전의 데이터를 삭제한 후 데이터를 로딩하기 위해서는 REPLACE
      옵션 대신 TRUNCATE 옵션을 사용한다.
      REPLACE 옵션을 사용할 경우 'DELETE FROM' 이라는 SQL 문장이 실행되게
      되는데, 이 경우 많은 양의 redo log 및 rollback 데이터가 발생하게 된다.
      반면 TRUNCATE 옵션을 사용할 경우 단순히 테이블을 truncate시키게 되므로
      redo log 및 rollback 정보가 발생하지 않는다.
    3. commit을 자주 하지 않을 경우 SQL*Loader가 보다 더 빨리 실행된다. command
      line 상에서 commit을 할 row 수의 최적화된 값을 지정할 수 있다. 이것은
      시스템의 메모리에 따라 달리 지정하게 되는데 ROWS = n (n은 사용자가 지정하는
      값)으로 지정하면 된다. 기본 값은 64이다. array 처리를 하여 속도가 개선되는
      것처럼 많은 양의 row를 처리한 후 commit을 하면 그 만큼 데이터베이스에 대한
      request가 줄어들게 된다.
    4. 데이터의 양이 많을 경우 redo log 파일의 크기가 충분하게 한다. 만약 redo log
      파일의 크기가 작을 경우 redo log를 switch할 때 마다 LGWR에서 timeout이
      발생하여 SQL*Loader에서 hang이 발생할 수 있다. 이와 같은 상황이 발생할 경우
      LGWR trace 파일이나 alert! log에 "file busy" 또는
      "can not advance to log sequence"라는 메시지가 남는다.
    5. bind array 크기를 가능한 크게 (단일 row 크기의 100배까지) 잡을 경우에도
      속도 개선이 가능하다. bind array 크기는 (#rows)*(maximum row size in bytes)
      값과 같다.
      이것은 파라미터 BINDSIZE 값을 지정하여 설정할 수 있다. ROWS 값도 적절하게
      큰 값을 사용하여야 한다. 그렇지 않을 경우 SQL*Loader에서는 기본값을 사용하게
      된다.
    6. SQL*Loader를 single-task로 운영되는 'sqlloaderst'로 link시킬 경우
      two-task에서 발생하는 overhead를 줄일 수 있다. 보통 benchmark test등에
      적절하다.
    7. 큰 데이터 파일을 loading할 때에는 tablespace에 rollback segment가 있고
      크기가 충분히 큰지 여부를 확인하여야 한다. 만약 tablespace에 freespace가
      없거나 적은 갯수의 rollback segment밖에 없을 경우에는 SQL*Loader가 hang이
      걸리거나 에러가 발생하게 된다.
    8. DIRECT PATH 옵션을 사용한다. 이 옵션을 사용하면 데이터가 SQL engine을 거치지
      않고 데이터파일에 바로 write된다. SQL engine을 거치지 않으므로 rollback
      segment도 사용되지 않는다.
      만약 DIRECT PATCH 옵션을 사용중이라면 다음과 같은 옵션을 사용하여 추가적인
      속도 개선을 얻을 수 있다.
    9. UNRECOVERABLE 절을 사용하면 loading 되는 데이터가 redo log에 기록되지
      않는다. 테이블에 index가 걸려 있을 경우에는 index에 대한 데이터는 redo log에
      기록된다.
    10. 테이블에 index가 걸려있고, 데이터가 index에 저장되는 순서되로 미리 정렬되어
      있다면 SORTED INDEX절을 사용할 수 있다.
      1) 데이터를 load 하기 전에 table은 empty 상태이어야만 한다.
      2) SORTED INDEX 절을 사용하는데 데이터가 올바로 정렬되어 있지 않다면
        인덱스의 status가 DIRECT LOAD 상태로 남게 된다.
    11. PARALLEL 옵션을 사용한다. 다중 SQL*Loader 세션을 사용할 경우 한개의 테이블
      도  parallel하게 loading 될 수 있다.