h4. 제1절 인덱스 기본 원리 * 인덱스의 가장 기본적인 구조는 B*Tree 인덱스다. * B*Tree 인덱스 탐색 과정은 수직적 탐색과 수평적 탐색으로 나눌 수 있다. * Oracle이 사용하는 인덱스 스캔 방식에는, Index Range Scan, Index Unique Scan, Index Full Scan, Index Fast Full Scan, Index Skip Scan 등이 있다. SQL Server가 사용하는 인덱스 스캔 방식에는 Index Seek 와 Index Scan 이 있다. * Oracle에서 제공하는 인덱스 종류로는 B*Tree 인덱스, 비트맵(Bitmap) 인덱스, 함수기반 인덱스(FBI), 리버스키(Reverse Key) 인덱스, 클러스터 인덱스 등이 있다. SQL Server의 인덱스 종류로는 클러스터형(Clustered) 인덱스와 비클러스터형(NonClustered) 인덱스가 있다. |
h4. 제2절 인덱스 튜닝 * 인덱스 선두 칼럼을 조건절에서 가공하면 인덱스가 정상적으로 사용될 수 없다. * 특히, DBMS 내부적으로 일어나는 묵시적(Implicit) 형변환 때문에 인덱스가 사용되지 못하는 경우가 있는지 주의를 기울여야 한다. * 인덱스 튜닝 원리는 테이블 Random 액세스 최소화와 인덱스 스캔범위 최소화, 2가지로 요약될 수 있다. * 특히, 인덱스를 경유한 테이블 Random 액세스가 성능을 저하시키는 주요인이고, 그 발생량이 일정 수준을 넘으면 테이블 전체를 스캔하는 것보다 오히려 늦다. * 인덱스 스캔 범위를 최소화하는 것도 인덱스 튜닝의 중요한 요소인데, 인덱스 선두 칼럼이 Between, 부등호, Like 같은 범위검색 조건일 때가 문제다. * 인덱스 스캔 범위를 최소화하기 위해 인덱스 선두 칼럼을 '=' 이나 In-List 조건으로 바꿔주는 것이 효과적일 수 있고, Index Skip Scan 을 활용하는 것도 효과적이다. * 인덱스를 설계할 때는 조건절에 항상(또는 자주) 사용되는 칼럼을 선정하고, 그 중에서 '=' 조건으로 자주 조회되는 칼럼을 앞쪽에 두어야 한다. |
h4. 제3절 조인 기본 원리 * 가장 기본적인 조인 메커니즘으로는 NL Join, Sort Merge Join, Hash Join, 3가지가 있다. * NL Join은 인덱스를 이용한 Random 액세스 위주이고, 한 레코드씩 순차적으로 진행하므로 소량의 데이터를 조인할 때 효과적이다. 특히, 부분범위처리가 가능한 OLTP 환경에서 유용하다. * Sort Merge Join은 양쪽 집합을 먼저 정렬한 다음, 임시 영역에 정렬된 양쪽 집합을 모두 스캔하면서 조인을 수행한다. * Hash Join은 조인되는 두 집합을 각각 Build Input과 Probe Input으로 지정하고, 우선 Build Input 각 레코드에 해시 함수를 적용해 해시 맵(Hash Map)을 만든다. 그러고 나서 남은 Probe Input을 하나씩 읽으면서 해시 맵을 탐색함으로써 조인을 수행한다. * Scalar Subquery의 캐싱 효과를 이용해 큰 성능 개선 효과를 얻는 경우가 종종 있다. |
h4. 제4절 고급 조인 기법 * 인라인 뷰를 활용해 단계적으로 조인을 방법이 유용할 때가 있다. * 배타적 관계의 조인, 부등호 조인 등을 활용하면 복잡한 업무를 쉽게 처리할 수 있다. * Between 연산자를 이용하면 선분이력 모델을 쉽게 제어할 수 있다. * 인덱스와 조인 수행 원리를 정확 이해한다면, 본서에서 소개한 것 외에도 다양한 고급 조인 기법을 개발해낼 수 있다. |