본문으로 바로가기

페이징 쿼리

category Development/MsSql 2008. 10. 30. 21:21

페이징에는 수 많은 방법들이 있습니다. MSSQL에서 주로 사용되던 방법으로 NOTIN 쿼리가 있습니다. 허나, 이는 쓸모없는 데이터들을 긁어온 후 '이것 빼고 10개만 가져와라...' 라는 형태이기 때문에 게시물이 엄청나게 늘어나는 대용량 게시판에는 절대적으로 어울리지 않습니다. 잘못하면 자칫 페이지 하나 클릭할 때 10초가 걸리기도 합니다 ㅡㅡ;;;

이러한 단점 때문에 요 근래에 주로 사용되는 방법으로는 건너뛰어야 할 seq번호에서 데이터를 1개 더 가져온 후, 그중 가장 작은 숫자를 뽑아내고, 그 다음 <= 를 이용해 페이지에 표시할 사이즈만큼 가져오는 쿼리가 주로 사용되고 있습니다. 하단의 쿼리를 참조하시면 쉽게 이해하실 수 있을 것입니다.

 SELECT TOP (@pageSize) seq, nickname, email, title, summary, commentCnt, readCnt, date
 FROM Board WHERE seq <= (SELECT MIN(seq) FROM (SELECT TOP (@skipCount + 1) seq FROM Board ORDER BY seq DESC) AS A)



그렇다고 이 방법이 최적인 것은 아닙니다. 하지만 MSSQL에서는 비교적 효율을 높일 수 있는 방법 중 하나입니다. 물론 대용량으로 갈 수록 NOT IN보다는 훨씬 효율이 좋습니다.

이외에도 저 쿼리를 기반으로 리스트에 묶음을 만들어 놓아(사전처럼 묶음의 인덱스를 만들어 놓음) 묶음과 함께 쿼리를 날려 속도를 높이는 방법도 있습니다. 제로보드나 기타 유명한 보드에서 검색 시 [다음검색] 이라고 나오는 게시판은 이와같은 구조를 가지고 있다고 생각하시면 됩니다 .

또 다른방법은,
@PAGE INT,                          --페이지인덱스
@PAGESIZE INT,                   --페이지사이즈
@TOTALCOUNT INT OUTPUT --리스트관련 카운터

 DECLARE @TOP INT
 DECLARE @COUNT INT
 BEGIN
  SET @COUNT = (@PAGESIZE * @PAGE) - (@PAGESIZE -1)
  SELECT @TOTALCOUNT = ISNULL(COUNT(SEQ),0)  FROM [테이블명] WITH(NOLOCK)
  
  SET ROWCOUNT @COUNT
  SELECT @TOP = [SEQ] FROM [테이블명] WITH(NOLOCK)
            ORDER BY SEQ DESC
 
  SET ROWCOUNT @PPAGESIZE
  SELECT * FROM [테이블명] WITH(NOLOCK)
            WHERE SEQ <= @TOP
            ORDER BY SEQ DESC
  SET ROWCOUNT 0
  END

'Development > MsSql' 카테고리의 다른 글

SQL 서버 2005, 그 변화 속으로  (0) 2010.07.27
테이블 수정  (0) 2010.07.21
쿼리분석기(Query Analyzer) 단축키  (0) 2008.10.30
MS SQL Text 검색  (0) 2008.10.30
BULK INSERT  (0) 2008.10.08