고급 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 튜닝 : 조인 부분 참고