
Index Range Scan)이고,Index Range Scan을 위해서는 인덱스 컬럼을 가공해서는 안된다.Index Full Scan이 발생한다.Index Range Scan은 인덱스에서 일정 범위를 스캔한다는 뜻이고,WHERE SUBSTR(생년월일, 5, 2) = '05'
Range Scan을 할 수 없고, Index Full Scan 또는 Table Full Scan을 수행WHERE NVL(주문수량, 0) < 100
NVL() 함수로 원본 값이 변형되어,Range Scan 불가능)NVL() 함수 사용시 Table Full Scan 발생Index Full Scan 가능성WHERE 업체명 LIKE '%대한%'
%가 앞에 있으면 문자열 시작 지점이 불확실하므로Range Scan) 불가능대한%처럼 끝이 확실한 경우 Range Scan이 가능%로 시작하면 Table Full Scan이 수행됨WHERE 전화번호 = :tel_no OR 고객명 = :cust_nm
OR조건은 각각의 조건을 따로 평가해 인덱스 효율성을 저하OR 연산자로 결합된 경우,OR로 연결된 각 조건이 각각 별도의 인덱스 접근 가능성을 가질 때OR로 연결된 조건이 복잡하지 않고 단순하게 독립적 형태일 때SELECT *
FROM 고객
WEHRE 고객명 = :cust_nm -- 고객명이 선두 컬럼인 인덱스 Range Scan
UNION ALL
SELECT *
FROM 고객
WHERE 전화번호 = :tel_no -- 전화번호가 선두 컬럼인 인덱스 Range Scan
AND (고객명 <> :cust_nm OR 고객명 IS NULL)
WHERE 전화번호 IN ( :tel_no1, :tel_no2)
IN은 OR을 표현하는 다른 방식일 뿐이므로 Range Scan이 불가능하다.SELECT *
FROM 고객
WHERE 전화번호 = :tel_no1
UNION ALL
SELECT *
FROM 고객
WHERE 전화번호 = :tel_no2
IN 조건도 위와 같이 UNION ALL 방식으로 작성하면,Range Scan이 가능하다.IN 조건절에 대해 IN-List Iterator 방식을 사용한다.IN 절에 여러 개의 값을 나열했을 때,IN절의 값이 상대적으로 적을 때SELECT * FROM 테이블 WHERE col IS NULL;
NULL 값은 저장되지 않거나(Oracle) 저장되더라도 일반적인 값과 구분됨NULL은 특정 값으로 비교가 어려워(정렬 기준이 모호) 효율적인 Range Scan이 불가능NULL을 포함하는 인덱스 또는 Table Full Scan으로 처리됨SELECT * FROM 테이블 WHERE col != 'A';
NOT은 전체를 확인해야 하므로Range Scan이 어려움Table Full Scan 발생ref. https://product.kyobobook.co.kr/detail/S000001975837