
SQLD 2과목 3챕터의 SQL 최적화 기본 원리 요점 정리
CBO : 테이블 및 인덱스 등의 통계 정보를 활용하여 SQL문을 실행하는데 소요될 처리시간 및 CPU, I/O 자원량 등을 계산하여 가장 효율적일 것으로 예상되는 실행계획 선택하는 옵티마이저
예상 비용 및 건수 등이 표시전체 테이블 스캔이 비용이 덜 들면 그것이 유리하다고 판단객체의 통계정보를 사용하여 실행계획을 수립하므로, 통계정보가 변경되면 SQL의 실행계획이 달라질 수 있음높은 우선순위 : 행에 대한 고유 주소 사용낮은 우선순위 : 테이블 전체 스캔실행계획 : SQL 처리를 위한 실행 절차와 방법 표현
실행계획을 통해 알 수 있는 정보
액세스 기법 표현중복된 키 값 Xnull 값 나타날 수 없음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 액세스 부하가 심할 때 사용작은 테이블을 선행 테이블로 사용하는 것이 유리조인 칼럼 인덱스가 없어도 사용할 수 있는 조인해쉬 함수를 이용하여 조인을 수행메모리의 지나친 사용으로 오버헤드 발생 가능성해시 조인 순서