더북(TheBook)

한 가지 알아 둘 점이 있다. 코드 2-14보다 코드 2-16의 쿼리가 더 적은 로우를 가져오므로 빠르게 수행할 것이라고 기대하겠지만 OrderDate가 인덱스 컬럼이 아니므로 테이블 스캔이 선택될 가능성이 더 크다는 것이다.

코드 2-16 WHERE 절을 변경한 쿼리

SELECT CustomerID, Sum(OrderTotal) AS SumOrderTotal

FROM Orders

WHERE OrderDate > ‘2015-12-01’

GROUP BY CustomerID;


 

인덱스는 ORDER BY 절의 효율에도 영향을 미친다. 정렬 작업은 많은 자원이 필요하다. 보통은 CPU 자원을 많이 사용하지만, 진짜 문제는 데이터베이스가 임시로 결과를 버퍼에 담아 둔다는 점이다. 즉, 첫 번째 결과가 반환되기 전에 모든 데이터를 읽어야 한다. 인덱스에는 인덱스 컬럼 데이터가 정렬되어 있다. 실제로 인덱스는 미리 정렬하는 방식으로 데이터를 저장한다. 따라서 인덱스를 사용하면 ORDER BY 절에 명시된 순서대로 데이터를 정렬할 필요가 없다.

메모리 사용량을 줄이려고 파이프라인(중간 결과 집합을 만드는 즉시 각 로우를 다음 조인 연산으로 넘겨 중간 결과 집합을 저장할 필요가 없다)을 사용할 수 있는 조인과 달리, 정렬 작업은 첫 번째 결과 집합을 만들기 전에 완료해야 한다.

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