
SELECT 대상 컬럼이 인덱스에 모두 포함되어 있는지 확인하여 테이블 액세스 여부를 결정한다.
처음으로 나타나는 범위검색 조건(부등호, between, like 등)까지만 만족하는 인덱스 레코드가 연속해서 모여있고, 그 이후 조건까지 만족하는 레코드는 비교 연산자 종류에 상관없이 흩어진다.
인덱스 레코드가 군집해 있을수록 읽어야하는 레코드의 수가 줄어들기 때문에 효율적이다.
인덱스 컬럼 중 일부가 조건절에 없거나, 등치 조건이 아니더라도, 그것이 뒤쪽 컬럼일 경우에는 비효율이 없다.
인덱스 선행 컬럼이 조건절에 없거나, 범위검색 조건(부등호, between, like 등)이면 비효율이 생긴다.
ex) 


범위검색 컬럼이 맨 뒤로 가도록 인덱스 구성을 변경하면 좋겠지만, 운영 시스템에서 인덱스 구성을 바꾸기는 쉽지 않다.
이럴 때 BETWEEN 조건을 IN-List로 바꿔주면 큰 효과를 얻을 수 있다.
ex)
where 인터넷매물 between '1' and '3'
and 아파트시세코드='A01011350900056'
and 평형 = '59'
and 평형타입 = 'A'
[인터넷매물+아파트시세코드+평형+평형타입]으로 인덱스가 구성되어 있을 때, 위 SQL을 수행하면 아래 그림처럼 인덱스 스캔 범위가 넓다.(비효율적이다)

하지만 BETWEEN 조건을 IN-List로 바꿔주면
where 인터넷매물 in('1','2','3')
and 아파트시세코드='A01011350900056'
and 평형 = '59'
and 평형타입 = 'A'

In-List 개수만큼 UNION ALL 브랜치가 생성되고, 모든 컬럼을 '='조건으로 검색하기 때문에 선두컬럼에 BETWEEN을 사용할 때와 같은 비효율이 사라진다.


BETWEEN조건을 In-List 조건으로 전환할 때 In-List 개수가 많지 않도록 주의해야 한다.In-List 개수가 많으면 수직적 탐색이 많이 발생하고, 이는 BETWEEN조건 때문에 리프 블록을 많이 스캔하는 것보다 더 비효율적일 수 있다.BETWEEN조건을 IN-List 조건으로 변환한 것과 같은 효과를 낼 수 있다.인덱스 선두 컬럼에 대한 옵션 조건에 OR 조건을 사용해서는 안된다.
필수 조건 컬럼을 인덱스 선두에 두고 액세스 조건으로 사용하면 LIKE/BETWEEN이 인덱스 필터 조건이어도 충분히 좋은 성능을 낼 수 있다.
하지만 변별력이 좋지 않은 필수 조건(만족하는 레코드가 다수)일 때는 Table Full Scan이 더 유리할 수도 있다.
따라서 LIKE/BETWEEN 패턴을 사용할 때는 아래 4가지 경우에 속하는지 반드시 점검해야 한다(BETWEEN은 1,2에 해당하는지만 점검)
1. 인덱스 선두 컬럼에 대한 옵션 조건에 사용 금지
2. NULL 허용 컬럼에 대한 옵션 조건에 사용 금지
3. 숫자형 컬럼이면서 인덱스 액세스 조건으로도 사용 가능한 컬럼에 대한 옵션 조건에 LIKE 사용 금지 (자동 형변환 때문에 인덱스 사용 불가)
4. LIKE를 옵션 조건에 사용할 때는 컬럼 값 길이가 고정적이어야 한다.
UNION ALL을 이용하여 변수에 값을 입력했는지에 따라 SQL을 실행할 수 있다.
위 SQL에서 cust_id 변수에 값을 입력하지 않으면 위쪽 브랜치에서 거래일자가 선두인 인덱스 사용
cust_id 변수에 값을 입력하면 아래쪽 브랜치에서 인덱스 사용
UNION ALL을 통해 변수에 값을 입력하든 안하든 인덱스를 가장 최적으로 사용할 수 있다.
UNION ALL은 옵션 조건 컬럼도 인덱스 액세스 조건으로 사용한다.
