이 페이징 쿼리 좀 봐주세요.. 0 1 2,959

by pirusira [SQLServer] [2011.03.23 18:56:25]



SELECT id,
   ipaddr,
   model,
   groupcode,
   last_print_time,
   pages,
   printcount,
   computation_price
FROM   (SELECT Row_number() OVER (ORDER BY ipaddr DESC, id DESC) AS rownum,
   id,
   ipaddr,
   model,
   groupcode,
   last_print_time,
   Isnull(SUM(pages), 0) AS pages,
   Isnull(COUNT(pages), 0)    AS printcount,
   Isnull(SUM(computation_price), 0) AS computation_price
    FROM   printer AS p
   LEFT OUTER JOIN (SELECT printerid
    FROM   pe_usage
    WHERE  print_time > '20100324000000'
   AND print_time < '20110324999999') AS pu
ON ( p.id = pu.printerid )
   LEFT OUTER JOIN state_code AS sc
ON ( p.statcode = sc.code )
    GROUP  BY id,
  ipaddr,
  model,
  groupcode,
  last_print_time) t1
WHERE  rownum BETWEEN 201 AND 210

rownum을 이용한 페이징을 위한 쿼리입니다.
보시는것처럼 지정한 날짜 사이에 있는 것을 가져와 ipaddr, id 순으로 정렬한 뒤 rownum을 이용해 해당 번호만 가져오는 것인데요
이게 속도가 왜이렇게 느린지 모르겠습니다...
데이터는 270만건 정도입니다.
왜 느린지.. 해결책은 있는지 답변 부탁드립니다.
by 마농 [2011.03.24 09:15:49]
오라클에서는 Rownum 을 이용해 페이징 처리를 하는데요.
MSSQL 이라면? 강력한 TOP n 쿼리가 존재하는데.
굳이 없는 rownum 을 분석함수로 대체해면서까지 오라클용 쿼리로 만드셨네요.

그리고 page 처리는 조인 없이 메인 테이블만으로 처리하시고
페이징처리의 결과집합을 가지고 조인하시면 조인의 일량이 줄어듭니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입