더북(TheBook)

인덱스를 사용할 수 있는 또 다른 방법은 데이터 클러스터링이다. 데이터 클러스터링은 연속적으로 접근되는 데이터를 실제로도 인접해서 저장하므로 I/O 연산이 줄어드는 것을 의미한다. 코드 2-11 쿼리를 살펴보자.

코드 2-11 WHERE 절에서 LIKE를 사용한 SQL

SELECT EmployeeID, EmpFirstName, EmpLastName

FROM Employees

WHERE EmpState = ‘WA’

  AND EmpCity LIKE ‘%ELLE%’;


 

EmpCity%를 붙인 LIKE 표현식을 쓰면 인덱스를 사용하지 못하므로 테이블 스캔이 필요하다. 하지만 EmpState 컬럼에 대한 조건은 이 컬럼을 인덱스로 만들기에 적합하다. 읽어야 하는 로우가 단일 테이블 블록에 저장되어 있다면 테이블 접근은 큰 문제가 되지 않는다. 데이터베이스가 읽기 연산 한 번으로 모든 로우를 가져올 수 있기 때문이다. 하지만 동일한 로우가 다른 블록에 분산해서 저장되어 있을 때, 해당하는 로우를 모두 가져오려면 많은 블록을 읽어야 하므로 심각한 문제가 될 수 있다. 다시 말해 해당 로우의 물리적인 분포에 따라 성능은 달라진다.

테이블의 로우를 인덱스 순서에 맞게 재정렬해서 쿼리 성능을 향상할 수 있지만, 이렇게 처리할 수 있는 경우는 드물다. 물리적인 테이블 로우는 단 하나의 순서로만 저장할 수 있어 오직 한 인덱스에서만 테이블을 최적화할 수 있기 때문이다.

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