더북(TheBook)

반면에 SELECT CustomerID FROM Customers WHERE CustomerID = 25를 실행하면 필요한 값이 모두 인덱스에 있으므로, 두 번째 단계는 불필요하게 테이블 데이터를 뒤져 보지 않고 유일 인덱스만 탐색할 것이다.

다음으로 SELECT * FROM Customers WHERE CustState = 'TX' 쿼리를 살펴보자. 코드 2-8에서는 CustState 컬럼에 인덱스를 만들었는데, 이 인덱스는 유일 인덱스가 아니다. 따라서 WHERE 조건을 만족하는 모든 값을 찾으려면 인덱스 전체를 뒤져 봐야 한다(인덱스 스캔). 인덱스에 있지 않은 컬럼도 SELECT 리스트에 있기 때문에 이런 값까지 가져오려면 테이블로 돌아가서 데이터를 가져와야 한다.

마지막으로 SELECT CustomerID FROM Customers WHERE CustAreaCode = '905' 쿼리를 보자. CustAreaCode 컬럼에는 인덱스가 없으므로 값을 찾으려면 테이블 스캔을 해야 한다. 즉, 데이터베이스 엔진은 CustAreaCode='905' 조건에 맞는 데이터를 찾으려면 테이블에서 전체 로우를 뒤져야 한다.

임의의 객체에서 모든 항목을 검색해야 특정 값을 찾을 수 있기 때문에 이때는 테이블 스캔과 인덱스 스캔에 큰 차이가 없어 보인다. 하지만 인덱스는 테이블에 비해 훨씬 작고 특별히 스캔용으로 설계된 객체이므로, 보통 테이블에 있는 소수의 로우만 검색할 때는 인덱스 스캔이 월등히 빠르다. 테이블에서 인덱스가 33% 정도 차지하고 있다면 인덱스를 사용한다고 해서 큰 혜택을 볼 수 없다는 말이다. 하지만 이 값은 정확한 것이 아니며, 빠르게 스캔이 가능한 기준점은 데이터베이스 엔진에 따라 33%보다 높거나 낮을 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.