서문
Chapter 01
SQL 튜닝의 시작은?
Chapter 02
서브쿼리와 성능 문제 이해하기
●서브쿼리에 대한 기본 내용 이해하기
-서브쿼리란
-서브쿼리의 사용 패턴에 대해 알아보자
●서브쿼리 동작방식 이해하기
-FILTER 동작방식
-조인 동작방식
-서브쿼리 동작방식을 제어하는 힌트들
●서브쿼리를 활용한 SQL 성능개선
-비효율적인 MINUS 대신 NOT EXISTS를 사용하자
-조인 대신 서브쿼리를 활용하자
-WHERE절의 서브쿼리를 조인으로 변경하자
Chapter 03
스칼라 서브쿼리의 이해와 효율적인 SQL 작성하기
●스칼라 서브쿼리의 특성 이해하기
-최대 결과 건수만큼 반복적으로 수행된다
-추출되는 데이터는 항상 1건만 유효하다
-데이터가 추출되지 않아도 된다
●스칼라 서브쿼리와 조인의 이해 및 활용하기
-스칼라 서브쿼리는 최종 결과 만큼 수행하자
-스칼라 서브쿼리와 조인의 관계로 보는 SQL 성능 문제
Chapter 04
WITH절 이해와 효율적인 SQL 작성하기
●WITH절 동작방식 이해하기
-MATERIALIZE 동작방식
-INLINE VIEW 동작방식
●SQL 성능 개선을 위한 WITH절 활용하기
-데이터 중복 액세스 제거하기
-VIEW PREDICATING 성능 문제 제거하기
-계층 쿼리의 데이터 처리 최소화 하기
●WITH절을 사용할 때 주의해야 할 점은?
-동시성이 높은 경우 MATERIALIZE 동작방식은 피하
-추출 건수가 많은 경우 WITH절은 피하자
-WITH절 선언 부분은 SQL의 가장 앞에 위치시키자
-WITH절에 동작방식 힌트를 추가하자
Chapter 05
MERGE 구문 이해와 효율적인 SQL 작성하기
●MERGE 구문의 구성요소 알기
-INTO 절
-USING 절
-ON 절
●MERGE 구문으로 처리되는 데이터 이해하기
-MERGE_T1 테이블에 몇 건 UPDATE 될까?
-MERGE_T1 테이블에 몇 건 DELETE 될까?
-MERGE_T1 테이블에 몇 건 INSERT 될까?
●MERGE 구문 작성 시 발생할 수 있는 에러와 해결방법 알아보기
-TARGET TABLE과 SOURCE TABLE의 조인은 1:1이어야 한다
-UPDATE 컬럼은 ON절에 사용할 수 없다
●MERGE 구문은 다양한 형태의 DML을 지원한다
●MERGE 구문을 성능 문제에 활용하자
Chapter 06
FUNCTION 수행과 SQL 성능 문제 이해하기
●FUNCTION 기본내용들 이해하기
-USER DEFINED FUNCTION의 의미
-USER DEFINED FUNCTION의 특징과 장점
-USER DEFINED FUNCTION의 종류와 사용법
●FUNCTION 동작방식 이해하기
-SELECT절에 사용하는 FUNCTION의 동작방식
-WHERE절에 사용하는 FUNCTION의 동작방식
●Function 수행과 SQL 성능 문제
-Function은 최종 추출 결과만큼만 수행하자
-Function이 스칼라 서브쿼리에서 수행하도록 변경하자
-Function을 호출하는 값의 패턴을 분석하자
-Select절에 사용된 Function을 조인으로 변경하자
-Where절의 Function을 Select절로 옮기자
Chapter 07
DECODE & CASE WHEN 이해 및 조건 문 처리하기
●DECODE
-구문
-구문에 대한 상세 설명
-DECODE와 성능 이슈
●CASE
-구문
-구문에 대한 상세 설명
-단순 CASE와 탐색 CASE 사용법
-예제를 통한 CASE의 사용법
Chapter 08
NULL 처리 구문 이해와 효율적인 SQL 작성하기
●NULL 처리 함수 이해하기
-NVL ()
-NVL2 ()
●NVL 활용하기
-실행계획 분리하기
-IS NULL 조회 개선하기
●그룹 함수(COUNT, SUM, MAX, MIN)와 NVL 처리
●NULLABLE 컬럼 사용에 의한 비효율 COUNT 함수 처리
●IS NULL 조회에 대한 개선방법 찾기
-NVL 처리와 FUNCTION BASED INDEX 생성
-컬럼 속성 변경(DEFAULT 설정)과 NULL 데이터 업데이트
-컬럼 추가 및 인덱스 생성 후 WHERE절 변경
●IS NOT NULL 조회에 대한 개선방법 찾기
-다양한 IS NOT NULL 처리와 SQL 성능 문제
-조인 처리 시 IS NOT NULL 활용하기
●' '(BLANK)와 NULL 데이터 처리하기
-' '(BLANK) 데이터가 NULL일까?
-TRIM & NVL 처리
-' '와 NULL 데이터 처리 관련 성능 문제
Chapter 09
날짜 데이터 관련 함수 조회하기
●데이터 타입 간 날짜 데이터 제어하기
-DATE 조회 - 에러가 발생하는 경우
-DATE 조회 - 정상 조회 되는 경우
-잘못된 날짜 연산들
●일자, 시간, 분, 초 계산하기
●날짜와 관련된 유용한 함수들
-TO_DATE & TO_TIMESTAMP & TO_CHAR(datetime)
-ADD_MONTHS
-MONTHS_BETWEEN
-LAST_DAY
-NEXT_DAY
-ROUND
-TRUNC
-EXTRACT
Chapter 10
임의의 데이터를 활용한 효율적인 SQL 작성하기
●CONNECT BY LEVEL로 데이터 추출하기
-임의의 숫자 만들기
-임의의 날짜 만들기
●CONNECT BY LEVEL 활용하기
-데이터 변환 시 CONNECT BY LEVEL 사용하기
-데이터 중복 조회 제거하기
-인덱스 처리 일량이 많은 경우
Chapter 11
컬럼 변형에 의한 SQL 성능 문제 이해하기
●조회 컬럼과 변수의 데이터 타입을 맞추자
●컬럼에 불필요한 ORACLE 제공함수를 사용하지 말자
-부적절하게 FUNCTION을 컬럼에 사용하는 경우
-컬럼 변형으로 인해 인덱스의 MIN/MAX를 활용하지 못하는 경우
-파티션 키 컬럼 변형은 모든 파티션을 읽는다
Chapter 12
조회 패턴에 맞게 SQL 실행계획 분기하기
●많은 조회 패턴을 가진 SQL은 하나의 SQL이 아니다
●SQL의 조회 패턴 별 실행계획을 분기하자
-여러 조건을 가진 SQL의 실행계획 분기하기
-변수 값의 범위에 따라 SQL을 분리하자
Chapter 13
ROWNUM 이해와 관련 SQL 성능 문제 이해하기
●ROWNUM 데이터를 먼저 추출한 이후 조회하자
●ORDER BY와 ROWNUM을 같은 위치에 두지 말자
●ROWNUM=1은 ROWNUM[=1로 사용하자
●INDEX_DESC와 ROWNUM[=1을 함께 사용하지 말자
●ROWNUM[=1은 항상 빠르지 않다
●인라인 뷰에 ROWNUM을 추가할 때는 주의하자
Chapter 14
화면 PAGINATION 처리할 때 이것은 지키자
●ROWNUM 처리를 잘하자
●인덱스 컬럼 순서와 ORDER BY절 순서를 맞추자
●PLAN에 나타나는 오퍼레이션 중 COUNT에 속지 말자
●NESTED LOOPS JOIN을 사용하자
NESTED LOOPS JOIN에 비효율이 많지 않은 경우 효과적이다
기본적인 형태의 PAGINATION을 익히자
Index