1. a+b+c 결합 인덱스에서 b,c만 사용하는 경우와 a,b만 사용하는 경우의 차이가 있을까?
2. and조건절은 순서대로 필터링할까?
1. 결합인덱스의 사용 의의와 특징
-결합인덱스란 무엇인가?
결합인덱스는 인덱스의 기준이 되는 칼럼이 2개 이상인 경우를 말한다. 토이 프로젝트만 경험한 경우, 결합인덱스의 필요성을 잘 이해하지 못할 수 있다. 예를 들어, AutoIncrement 속성을 가진 기본 키를 사용하면 충분하다고 생각할 수 있다. 하지만 실제 업무에서는 여러 칼럼을 조합하여 인덱스를 설정해야 할 필요성이 자주 발생한다.
-결합인덱스의 필요성
실제 업무 환경에서는 검색 기준이 되는 칼럼이 여러 개인 경우가 많다. 예를 들어, 고객번호, 개설일, 번호라는 세 가지 칼럼이 있고, 40개의 테이블과 3개의 데이터베이스에서 사용된다고 가정하자. (즉 모든 테이블에서 가장 중요한 검색조건이다.)
여러분이 담당하는 서비스가 고객번호, 개설일, 번호 세 개를 사용할 때, 고객번호가 고유하다면 고객번호로만 인덱스를 사용해도 되지만 여러분에게 주어진 상황은 일정 기간이 지나면 고객 번호를 재사용한다고 가정한다. -> 실제 우리 회사도 이런 경우가 있다.
이를 구분하기 위해 고객번호, 개설일, 번호를 조합하여 기본 키(Primary Key)를 설정하고 인덱스를 지정하는 것이 필요하다. 위 같은 상황일 경우 a+b+c로 검색을 한다면 당연히 인덱스를 타겠지만 b,c만 사용하는 경우와 a,b만 사용하는 경우의 차이가 있을까??
정답은 차이가 있다. a,b는 인덱스 랜덤 액세스를 하고 b,c는 인덱스를 대부분 타지 않는다.
-인덱스 랜덤 엑세스란?
인덱스 랜덤 액세스란 인덱스에 접근한 뒤 확인한 값으로 테이블 스캔을 진행하는 것을 말한다. 랜덤 엑세스라고 이름이 붙는 이유는 테이블에 랜덤하게 접근하기 때문이다.
where절에 a+b+c 항목을 다 넣고 랜덤 엑세스를 줄여야한다. 하지만 현실적으로 조회조건이 많은 경우 랜덤엑세스는 발생할 수 밖에 없고 이를 최대한 줄이는 것이 쿼리튜닝이다.
2. AND 절 탐색 순서
AND절에 있는 조건들은 순서대로 필터링이 진행될까?
where t.a = y.a
and t.b = y.b
and t.c = y.c
and t.z = y.z
and t.k in ('ab', 'ac', 'ak')
and t.g like 'test%'
;
위 쿼리의 진행 순서는 어떻게 될까?
질문에 대한 답변부터 하자면 순서대로 진행되지 않는다. DB의 옵티마이저가 가장 빠르게 작동할 수 있는 필터링 조건을 알아서 인식해서 빠른 것부터 수행한다.
a,b,c칼럼이 결합인덱스라면 보통 결합인덱스부터 수행하고, 그 외에 칼럼들은 DB에서 자체적으로 판단해서 수행한다.
다만 옵티마이저가 항상 최적의 값만 수행하지 않기 때문에 힌트를 넣거나 쿼리를 수정하는 쿼리튜닝 작업을 통해 최적으로 수행하도록 한다.
-참조
'IT > DB' 카테고리의 다른 글
Connection reset by peer 오류 해결기 (0) | 2025.01.07 |
---|