이처럼 WHERE 절에서 함수를 사용하는 쿼리는 인덱스로 쿼리 속도를 빠르게 하지 못하고(‘BETTER WAY 28. 데이터베이스 엔진이 인덱스를 사용하도록 사거블 쿼리를 작성하자’ 참고) 테이블 스캔이 수행된다. 이 함수는 테이블에 있는 모든 로우에 적용해야 하기 때문이다.
하지만 코드 2-28과 같이 인덱스를 만든다면 코드 2-27에 있는 쿼리는 인덱스를 사용할 것이다.
코드 2-28 대·소문자를 구분하는 RDBMS에서 인덱스 생성
CREATE INDEX EmpLastNameUpper
ON Employees (UPPER(EmpLastName));
DB2, SQL Server, 오라클, PostgreSQL에서는 함수 기반 인덱스로 UPPER() 같은 내장 함수는 물론 ‘컬럼1 + 컬럼2’ 같은 표현식이나 사용자 정의 함수까지도 사용할 수 있다.
Note ≣
SQL Server에서는 단순히 함수를 기반으로 인덱스를 만들 수 없고, 테이블에 계산 컬럼을 추가한 후 이 컬럼에 인덱스를 만들어야 한다.