본문 바로가기

Oracle DB

고급 SQL 활용 / DML 튜닝

고급 SQL 활용

 

(1) CASE문 활용

- 여러 번 테이블을 ACCESS하는 경우 CASE문을 활용하여 1번만 액세스

EX) NVL( SUM (CASE WHEN COLUMN = VALUE THEN COLUMN END), 0 )

 

 

(2) UNION ALL을 활용한 M:M 관계의 조인

- FULL OUTER JOIN을 대체할 용도로 UNION ALL 활용 가능

-> FULL OUTER JOIN을 할 경우 테이블을 각각 2회씩 ACCESS, UNION ALL 1번

 

 

(4) 페이징 처리

 

 

(5) WINDOW 함수 활용

 

 

(6) WITH 구문 활용

- 자주 쓰는 SELECT FROM 절일 경우 WITH 구문을 통해 한번 선언하고 테이블처럼 어디에서나 이용 가능하게 활용 가능하다.

 

 

 

DML 튜닝

 

(1) 인덱스 유지 비용

- 테이블 데이터 변경시 인덱스도 변경

- 변경할 인덱스 레코드 찾는 비용, REDO, UNDO를 생성하는 비용 추가

- 인덱스가 많을수록 DML 성능 저하

- UPDATE 수행 시 테이블은 직접 변경, 인덱스는 DELETE & INSERT 방식

- 인덱스는 항상 정렬된 상태로 유지, 따라서 인덱스 유지를 위한 UNDO도 2개씩 기록

- UPDATE시 관련 인덱스 수에 따라 성능 좌우

- INSERT, DELETE는 인덱스 모두에 변경을 가해야 하므로 총 인덱스 수에 비례

- 대량의 데이터 입력/수정/삭제 시 인덱스 DROP또는 UNUSABLE 상태 변경 후 인덱스 재생성이 더 빠를 수도 있음

 

 

(2) INSERT 튜닝

- DIRECT PATH INSERT : 일반 HEAP TABLE과 달리 FREELIST를 거치지 않고 HWM 상위 영역에 버퍼캐시를 거치지 않고 직접 데이터 파일에 입력하고 UNDO에 데이터를 쌓지 않아 속도 향상된다. (사용자가 COMMIT할 때만 HWM을 상향 조정하면 되기 때문)

-> INSERT SELECT 문장에 /*+ APPEND */ 힌트를 사용하며 병렬 모드로 INSERT. DIRECT 옵션을 지정하고 SQL LOADER(SQLLDR)로 데이터 로드.

- NOLOGGING MODE INSERT : 테이블 속성을 NOLOGGING으로 변경 시 REDO LOG까지 최소화. -> DATA DICTIONARY 변경 시에만 로깅, DIRECT PATH INSERT 일 때만 작용. 일반적인 INSERT엔 X. “ALTER TABLE T NOLLOGING;” 형식으로 사용

*주의 : EXCLUSIVE MODE TABLE LOCK으로 DDL LOCK으로 OLTP 사용 불가하며 입력한 데이터 장애 발생 시 복구가 불가능

 

 

(3) UPDATE 튜닝 : 조인 부분 참고

 

'Oracle DB' 카테고리의 다른 글

파티셔닝  (0) 2021.04.04
배치프로그램 튜닝  (0) 2021.04.03
소트 튜닝  (0) 2021.04.03
쿼리 변환  (0) 2021.04.03
서브쿼리 / 집합연산 / Join - Using , On, Outer Join  (0) 2021.04.03