반응형

pageSize = 15

SELECT 
   * 
FROM 
( 
   SELECT 
      BOARDIDX, TITLE, USERID, ROW_NUMBER() OVER (ORDER BY BOARDIDX DESC) AS IDX  
   FROM
      BOARD 
) AS RESULTS
WHERE
   IDX BETWEEN ? + 1 AND ?

.Parameters.Append .CreateParameter("@PAGE", adInteger, adParamInput, , (currentPage-1) * pageSize)
.Parameters.Append .CreateParameter("@PAGE2", adInteger, adParamInput, , currentPage * pageSize)

게시판 페이징 쿼리를 짤 때 거추장스럽게 select .... 이후 똑같은 select 쿼리를 not in 안에 넣어 불필요하게 쿼리가 길어지는 방식을 취하는 방식을 종종 볼 수 있다.
굴러만 간다면 좋지만 이런 not in 방식은 심각한 성능 저하를 초래하게 된다.
예를들어 전체 데이터가 100만건이고 분포도가 나쁜 이용자 이름 검색을 통한 게시판 결과를 보려 한다면
첫페이지는 그럭저럭 만족할만한 성능을 보여줄 것이다.
하지만 2페이지, 3페이지... 페이지가 뒤로 갈 수록 그 속도는 보장할 수 없게 된다.
(제 아무리 인덱스를 걸었다 치더라도.)

그냥 ROW_NUMBER()를 이용한다면 페이지가 뒤로 이동하여도 균등한 결과를 보장 받을 수 있을것이다.
쿼리 자체도 길어지지 않으니 사용 안할 이유가 없다.
where조건이 10개만 붙어봐라. 나중에 유지보수 하려면 본인이 하더라도 욕 나온다.

반응형
Posted by Hippalus
,