현 프로젝트에서 대량의 데이터를 적재하기 위해 오라클에서 INSERT 문을 사용하여 데이터를 적재하고 있었다. 조금 오래걸리지만 데이터 용량이 커서 그러겠거니 하면서 평화롭게 적재를 하고 있던 도중, IT 현업이 내려와서 대용량 데이터를 압축도 안시키고 그냥 적재하고 있냐며 한바탕 쿠사리를 주길래... 당황 겸 혼나면서 찾아본 append 힌트 구문... 정확이 append 구문을 언제 사용하며, 사용하는 방법에 대해 적어보려 한다.
1. append 힌트를 사용하는 이유가 무엇인가?
이것저것 찾아보니 다른 곳에서도 통상적으로 대량의 데이터를 INSERT 시킬 때에 많이 사용하는 문구가 APPEND 힌트라고 한다. APPEND 힌트를 사용하면, 중간에 버퍼 캐시를 경유하지 않고 바로 데이터 블록을 쓸 수 있어(아래와 같은 기능을 다이랙트 패스 인서트(direct path insert)라고 한다.) 적재하는 시간이 단축된다고 말한다. 또한 APPEND 힌트를 쓰면 리드 로그가 생성되지 않아서 빠르게 수행될 수 있다는 장점도 있다고 한다. (압축을 해서 넣는다기보다는 캐시를 생성하지 않아 빠른 것인데... 왜 압축이라는 단어를 말하셨는진 의문..)
2. append 힌트 사용 방법
보통 INSERT구문을 사용할 때에는 두가지 방법이 있다.
1) INSERT INTO (to_table) SELECT * FROM (from_table);
2) INSERT INTO (to_table) values (val1, val2,.....);
위 INSERT 구문에는 APPEND를 사용하는 방법이 조금씩 다르다.
1) select 문을 사용하여 insert할 경우
INSERT /*+ APPEND */ INTO (to_table)
SELECT * FROM (from_table)
;
COMMIT;
2) insert values 절을 사용할 경우
insert values를 사용하는 것은 버전 별로 조금씩 다르다.
- 10gR2
insert into (to_table) values (...) 에서는 /*+ append */ 힌트를 사용해도 direct_path insert가 안된다. insert into ... select에서만 append힌트가 적용된다. - 11gR1
insert into (to_table) values (...) 에서 /*+ append */ 힌트를 사용하면 direct_path insert가 적용된다. - 11gR2
insert into (to_table) values (...) 에서 /*+ append */ 힌트를 사용하면 direct_path insert가 적용되지 않는다. 대신에 /*+ append_values */를 사용해야 direct_path insert가 적용된다.
INSERT /*+ APPEND_VALUES */ INTO (to_table) VALUES (VAL1, VAL2, ....);
COMMIT;
3. append의 단점도 있나?
append 힌트가 최고라고 생각할 수도 있겠지만, 일단 찾아본 바로는 append힌트의 단점도 분명히 있다.
테이블에 대한 베타 락이 걸려서 해당 insert 가 종료할 때까지는 다른 트렌잭션에서 insert/update/delete문을 동시에 실행할 수 없다고 한다. 또한 noarchivelog 모드 데이터 베이스가 사용되고 있는 경우나, nologging으로 표시된 테이블을 대상으로 작업하고 있는 경우만 append 힌트가 리드 로그를 생성하지 않아 해당 상황이 아니라면, 또는 테이블 인덱스 로그를 남긴다면, append 힌트는 쓰나마나라고 한다.
현재 현업의 상태가 어떤지는 정확하게 알지 못하나... 추후에도 동일한 상황이 생기지 않기 위해 알아보는것을 추천한다.
ref.
'Code > Oracle' 카테고리의 다른 글
[Oracle] Oracle Exadata의 압축방식 (Exadata Hybrid columnar Compression, EHCC) (0) | 2022.05.21 |
---|---|
[Oracle] Oracle Exadata란 무엇인가 (0) | 2022.05.14 |
[Oracle] 오라클 힌트(hint)의 개념, 사용법 알아보기 (0) | 2022.03.27 |
[Oracle] 오라클 WITH절을 사용하여 임시테이블 만들기 (0) | 2022.03.12 |
[Oracle] SQL 병렬 힌트를 부여하여 쿼리 수행시간 단축하기 (0) | 2022.02.26 |