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개만 붙어봐라. 나중에 유지보수 하려면 본인이 하더라도 욕 나온다.
'모바일 & 앱' 카테고리의 다른 글
동적 생성된 checkbox attr로 체크시키기 (0) | 2020.03.16 |
---|---|
subquery left outer join (0) | 2020.03.13 |
jQuery checkbox 체크시 해당 row의 td내 특정 textbox로 focus 이동시키기 (0) | 2020.03.06 |
iPhone의 push개발시 푸시 아이콘 옆에 나타나는 앱 이름이 안바뀔 때 (0) | 2020.01.17 |
node.js 작업 스케줄러에 등록하여 실행시키기 (0) | 2020.01.14 |