SQLD
2과목 3챕터의 SQL 최적화 기본 원리 요점 정리
CBO
: 테이블 및 인덱스 등의 통계 정보를 활용하여 SQL문을 실행하는데 소요될 처리시간
및 CPU, I/O 자원량
등을 계산하여 가장 효율
적일 것으로 예상되는 실행계획 선택하는 옵티마이저
예상 비용
및 건수
등이 표시전체 테이블 스캔
이 비용이 덜 들면 그것이 유리하다고 판단객체의 통계정보
를 사용하여 실행계획을 수립하므로, 통계정보가 변경
되면 SQL의 실행계획이 달라
질 수 있음높은
우선순위 : 행
에 대한 고유 주소 사용낮은
우선순위 : 테이블 전체
스캔실행계획
: SQL 처리를 위한 실행 절차와 방법 표현
실행계획을 통해 알 수 있는 정보
액세스 기법
표현중복된 키 값 X
null
값 나타날 수 없음FTS(Full-Text Search)
사용조회
성능 향상/삽입,삭제,갱신
성능 저하B-tree
는 관계형 DB의 주요 인덱스 구조제거
하고 데이터 입력SQL Server
의 클러스터형 인덱스
는 Oracle
의 IOT(Index-Organized Table)
와 매우 유사update
시, update
작업에는 부하 없음 ( INSERT, DELETE와는 다름)인덱스를 구성하는 컬럼들의 순서
는 SQL 실행 성능
과 매우 관계B-TREE 인덱스
: 브랜치 블록
과 리프 블록
으로 구성, 브랜치 블록
은 분기
를 목적으로 하고 리프 블록
은 인덱스를 구성하는 컬럼의 값
으로 정렬. 일반적으로 OLTP(온라인 트랜잭션 처리)시스템 환경
에서 가장 많이 사용
10% 이하
만 검색시 유리일치
및 범위 검색
에 적절한 구조CLUSTERED 인덱스
: 인덱스의 리프 페이지
가 곧 데이터 페이지
이며, 리프페이지
의 모든 데이터는 인덱스 키 컬럼
순으로 물리적으로 정렬
되어 저장
BITMAP 인덱스
: 시스템에서 사용될 질의를 시스템 구현 시에 모두 알 수 없는 경우
인 DW
및 AD-HOC
질의 환경을 위해 설계. 하나의 인덱스 키 엔트리가 많은 행
에 대한 포인터
를 저장하고 있는 구조
UNIQUE SCAN
: 유일한 값 하나 찾기(ex.고객아이디)RANGE SCAN
: 어떠한 조건에서 범위 찾기SKIP SCAN
: 결합 인덱스의 선행 컬럼에 대한 조건이 없고, 후행 컬럼에 대한 조건이 있는 경우FAST FULL SCAN
: select절과 조건절에 사용된 모든 컬럼이 인덱스 컬럼으로 인덱스 블록만 스캔하여 원하는 데이터 검색FULL SCAN
: 전체 데이터오라클의 실행계획에 나타나는 기본적인 Join 기법
으로는 NL Join
, Hash Join
, Sort Merge Join
등
EXISTS
: SEMI JOIN
으로 표현OLTP
의 목록 처리 업무에 사용조인 칼럼
에 적당한 인덱스
가 있어 자연조인이 효율
적일 때 유용Driving Table
의 조인 데이터 양
이 큰 영향을 주는 조인 방식Driving Table
: Join시 먼저 액세스돼서 Access Path를 주도하는 테이블)유니크 인덱스
를 활용하여 수행시간이 적게
걸리는 소량
테이블을 온라인 조회
하는 경우 유용결과 행의 수가 적은
)테이블이 선행 테이블로 선택되는 것이 유리랜덤 액세스 방식
으로 데이터를 읽음조인 칼럼
에 적당한 인덱스
가 존재할 경우 사용선행 테이블
의 각 레코드들에 대해 후행 테이블
의 인덱스 접근 구조를 사용하여 직접 검색 후
조인Sort Merge Join
: 조인 컬럼 기준으로 데이터를 정렬
하여 조인 수행
DW
등에서 데이터 집계하는 업무에 많이 사용조인 컬럼
에 적당한 인덱스가 없어
서 NL조인이 비효율적일 때
사용Driving Table
의 개념이 중요하지 않은
조인 방식조인 조건
의 인덱스 유무에 영향 받지 XEQUI(=)
, NONEQUI(between, >, < 등)
에서 동작범위 연산
인 경우 Nested Loop보다 유리Join대상
이 Join Key 컬럼으로 정렬되어있을 때는 Sort Merge Join이 Hash Join보다 우수한 성능을 보여줄 수 있음메모리에서 모든 정렬 작업 수행이 어려운 경우 임시 영역(디스크)를 사용
하므로 성능이 떨어질 수 있음DW
등에서 데이터 집계하는 업무에 많이 사용Sort Merge Join
하기에 두 테이블이 너무 커서
Sort 부하
가 심할 때 유용EQUI(=)
조인 조건에서만 동작조인 컬럼
에 적당한 인덱스가 없어
서 NL조인이 비효율적일 때
사용NL 조인
시 Driving 집합
쪽으로 조인 액세스량이 많아 Random 액세스 부하
가 심할 때 사용작은
테이블을 선행 테이블로 사용하는 것이 유리조인 칼럼 인덱스가 없어
도 사용할 수 있는 조인해쉬 함수
를 이용하여 조인을 수행메모리
의 지나친 사용으로 오버헤드 발생 가능성
해시 조인 순서