NOT IN 방식은 페이지가 증가할 수록 성능은 반감할 수 밖에 없는 구조입니다.
이를 개선하기 위해서는 TOP...TOP...방식을 사용하게 됩니다.
우선 페이지수*페이지당행수의 Key값을 가져온 다음 역순으로 필요한 행만을 가져오는 방식입니다.
예를 들어, 20 페이지이고 한 페이지당 5건의 데이터를 가져와야 한다면,
아래와 같이 키 값을 105 건 가져온 다음, 이 중 맨 마지막 5 건만 가져오고,
마지막으로 다시 정렬조건에 따라 정렬하여 결과를 반환하면,
최소 비용으로 페이징 처리를 할 수 있습니다.
SELECT TOP (5) * FROM ( SELECT TOP (5) * FROM (SELECT TOP ((20+1)*5) 키 FROM 테이블 WHERE 검색조건 = '' ORDER BY 정렬조건 DESC) A ORDER BY 정렬조건 ASC) B ORDER BY 정렬조건 DESC
물론, 이때 내부 쿼리에 해당하는 검색조건, 정렬조건, 키값 등이 인덱스에 적절하게 포함되어 있어야
불필요한 비용을 최소화할 수 있습니다.
정렬조건이나 기타 검색조건이외의 단순 출력용 칼럼의 경우, 맨 마지막 5건에 대해서만 계산하여 가져올 수 있도록 해야 성능을 향상할 수 있습니다.
감사합니다.
출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10205&docId=69841185
'헬로마켓'과 함께하는 스마트한 중고 아이템 거래