6장. DML 튜닝 1
6.1.1 미존
6.1.2 ~ 6.1.4 민이
6.1.5 ~ 6.1.6 지표
6.2 워니
실행계획이란?
https://coding-factory.tistory.com/744
6.2 Direction Path I/O 활용
온라인 Transaction | 정보계 시스템 배치 프로그램 |
반복 읽기 | 대량 데이터 |
버퍼캐시가 도움을 준다 | 버퍼캐시 성능 떨어뜨림 |
다이렉트 I/O 사용해야한다 |
1. Direct Path I/O
오라클은 버퍼캐시를 경유하지 않고 바로 데이터 블록을 읽고 쓸 수 있는 Direct Path I/O 기능을 제공한다.
일반적 I/O | 대용량 데이터 |
DB 버퍼 캐시 경유함 | 찾을 가능성이 낮다. |
찾고자 하는 데이터가 없을 떄 디스크를 읽는다 | |
데이터 변경할때도 버퍼캐시에서 먼저 찾고 버퍼 블록에 변경 후 -> 블록을 주기적으로 찾아 데이터파일에 반영함 |
대량 블록을 건건이 디스크 -> 버퍼 캐시로 적재 후 읽기 부담스럽다 |
자주 읽는 블록의 반복적 I/O call 을 줄임 성능을 높임 |
재사용성이 낮다 |
다이렉트 I/O 사용해야한다 |
Direct Path I/O 기능이 작동하는 경우
2. Direct Path Insert
일반적인 insert | Direct Path Insert |
데이터를 입력할 수 있는 블록을 Freelist에서 찾는다 테이블 HWM 아래쪽에 있는 블록 중 데이터 입력이 가능한 블록 |
Freelist 참조하지 않는다. 테이블 HWM 바깥 영역에 데이터를 순차적으로 입력 |
Freelist에서 할당 받은 블록을 버퍼캐시에서 찾는다 | 버퍼캐시에서 블록을 탐색하지 않는다 |
insert 내용을 Undo 세그먼트에 기록한다 | Undo 로깅 안한다 |
insert 내용을 Redo 로그에 기록한다 | Redo 로깅 안하게 할 수 있다. nologging 모드로 테이블을 전환 -> Direct Path Insert함 Alter table 테이블명 NOLOGGING; |
Freelist
테이블 HWM 아래쪽에 있는 블록 중
데이터 입력이 가능한 블록을 목록으로 관리함
테이블마다 데이터 입력이 가능한 블록 목록을 관리
Redo 로깅 | Undo |
오라클은 데이터파일과 컨트롤 파일에 가해지는 모든 변경사항을 Redo로그에 기록한다 Redo로그는 트랜잭션 데이터가 어떤 이유에서 유실됐을 때, 트랜잭션을 재현함으로써 유실 이전 상태로 복구하는 데 사용된다. DML을 수행할때마다 Redo로그를 생성한다. |
|
과거 -> 현재 상태 되돌림 |
현재 -> 과거로 되돌림 |
트랜잭션을 재현하는데 필요한 정보를 로깅 |
변경된 블록을 이전 상태로 되돌리는데 필요한 정보를 로깅 |
Redo 안하게 하는 방법 있음 | Undo 안하게 하는 방법 없음 |
Direct Path Insert 하게 하는 방법
1) append_value 힌트 사용
Direct Path Insert 사용 주의점
1) TM LOCK*이 걸린다
커밋 전가지 다른 트랜잭션은 해당 테이블에 DML을 수행하지 못한다.
TM LOCK* Table을 보호하는 락
2) 테이블의 사이즈가 계속 늘어난다
Freelist 조회 하지 않고 HWM 바깥 영역에 데이터 입력 함으로
여유 공간을 사용하지 않고 계속 증가한다.
과거 데이터를 delete해도 마찬가지다.
단 drop 하면 공간 반환이 제대로 이뤄진다.
비파티션 테이블이면 주기적으로 Reorg작업을 수행해줘야 한다.
truncate 와 delete 와 drop의 차이
DELETE | TRUNCATE | DROP |
DELETE 후에는 데이터만 지워지고 쓰고 있던 디스크 상의 공간은 그대로 가지고 있습니다. | TRUNCATE 작업은 최초 테이블이 만들어졌던 상태, 즉 데이터가 1건도 없는 상태로 모든데이터 삭제, 칼럼값만 남아 있습니다. 그리고 용량도 줄고 인덱스 등도 모두 삭제 됩니다. → DELETE보다 TRUNCATE가 더 좋아 보이나 DELETE는 원하는 데이터만 골라서 삭제가 가능하나 TRUNCATE는 그렇지 못합니다. |
DROP 명령어는 데이터와 테이블 전체를 삭제하게 되고 |
https://lee-mandu.tistory.com/476
3. 병렬 DML
insert | update, delete |
append 힌트를 사용 -> Direct Path Write | Direct Path Write 불가능 |
병렬 DML을 사용해야 가능하다 : 병렬 DML은 항상 Direct Path Write 방식 사용함. |
Insert/Update/Delete/Merge 같은 DML SQL 을 병렬처리 하고자 하는 경우에는
반드시 alter session enable parallel dml ; 을 해줘야 병렬로 동작합니다.
위에서 insert, update, delete에서
parallel 힌트를 기술한게 보인다. 이는 Direct path insert 방식으로 데이터를 입력하는 방법이다.
힌트를 기술했는데 병렬 DML을 활성화 되지 않으면 병목현상이 발생한다.
병렬 DML을 활성화 되지 않은 상황을 예비하려면 힌트로 append를 넣어라.
근데, Parallel DML 의 경우 깜빡하는 부분이 alter session 을 해주는 부분입니다.
Insert/Update/Delete/Merge 같은 DML SQL 을 병렬처리 하고자 하는 경우에는 반드시
alter session enable parallel dml ;을 해줘야 병렬로 동작합니다.
12c DB 부터는 이걸 힌트에 삽입할 수 있는 방법이 생겼습니다.
/*+ enable_parallel_dml */ 과 같이 해주면 alter session enable parallel dml ; 을 한 것과 같은 효과를 발휘합니다.
정리하면, Oracle DB 에서 Parallel DML 하는 경우 아래와 같이 2가지 방식으로 처리할 수 있습니다.
1) alter session enable parallel dml ;
insert /*+ parallel(8) */ into TEST2
select * from TEST1;
2) insert /*+ enable_parallel_dml parallel(8) */ into TEST2
select * from TEST1;
'SQL > 친절한 sql 튜닝' 카테고리의 다른 글
[8주차] 번호 매기기 (0) | 2022.05.10 |
---|---|
[6주차] 소트 튜닝 (0) | 2022.04.24 |
[5주차] 소트 머지 조인 (0) | 2022.04.17 |
[4주차] 인덱스 튜닝 (0) | 2022.04.10 |
[3주차] 테이블 액세스 최소화 (0) | 2022.04.03 |