책소개
SQL 튜닝이란 튜닝 대상이 되는 SQL을 이해하고, SQL이 가진 정보들, 테이블/인덱스/칼럼의 정보 및 업무적 성격 등을 치밀하게 분석하여 얻어지는 결과일 뿐이다. SQL의 이해와 SQL의 효율적인 작성부터 시작하여 SQL 튜닝을 익히도록 도와준다.
목차
서문Chapter 01SQL 튜닝의 시작은? Chapter 02서브쿼리와 성능 문제 이해하기 ●서브쿼리에 대한 기본 내용 이해하기 -서브쿼리란 -서브쿼리의 사용 패턴에 대해 알아보자 ●서브쿼리 동작방식 이해하기 -FILTER 동작방식 -조인 동작방식 -서브쿼리 동작방식을 제어하는 힌트들 ●서브쿼리를 활용한 SQL 성능개선 -비효율적인 MINUS 대신 NOT EXISTS를 사용하자 -조인 대신 서브쿼리를 활용하자 -WHERE절의 서브쿼리를 조인으로 변경하자 Chapter 03스칼라 서브쿼리의 이해와 효율적인 SQL 작성하기 ●스칼라 서브쿼리의 특성 이해하기 -최대 결과 건수만큼 반복적으로 수행된다 -추출되는 데이터는 항상 1건만 유효하다 -데이터가 추출되지 않아도 된다 ●스칼라 서브쿼리와 조인의 이해 및 활용하기 -스칼라 서브쿼리는 최종 결과 만큼 수행하자 -스칼라 서브쿼리와 조인의 관계로 보는 SQL 성능 문제 Chapter 04WITH절 이해와 효율적인 SQL 작성하기 ●WITH절 동작방식 이해하기 -MATERIALIZE 동작방식 -INLINE VIEW 동작방식 ●SQL 성능 개선을 위한 WITH절 활용하기 -데이터 중복 액세스 제거하기 -VIEW PREDICATING 성능 문제 제거하기 -계층 쿼리의 데이터 처리 최소화 하기 ●WITH절을 사용할 때 주의해야 할 점은? -동시성이 높은 경우 MATERIALIZE 동작방식은 피하 -추출 건수가 많은 경우 WITH절은 피하자 -WITH절 선언 부분은 SQL의 가장 앞에 위치시키자 -WITH절에 동작방식 힌트를 추가하자 Chapter 05MERGE 구문 이해와 효율적인 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 06FUNCTION 수행과 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 07DECODE & CASE WHEN 이해 및 조건 문 처리하기 ●DECODE -구문 -구문에 대한 상세 설명 -DECODE와 성능 이슈 ●CASE -구문 -구문에 대한 상세 설명 -단순 CASE와 탐색 CASE 사용법 -예제를 통한 CASE의 사용법 Chapter 08NULL 처리 구문 이해와 효율적인 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