db/mssql

리스트 페이징(6가지)

C/H 2006. 10. 20. 01:38
다음은 데브피아 이원문 님의 글입니다.

---------------------------------------------------------------------------

제가 어느 페이징이 제일 빠를까.. 고민 하다가.. 테스트로 만들어 보았습니다.
총.. 6가지..입니다..

간단하게 쿼리를 설명해드리겠습니다.

1. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]

1번 리스트는 이 쿼리 구문을 써서 했고요. 현제 개시물까지 이동을 Rs.Move(이동할수) 로 처리 했습니다.

2. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명] - 1번과 동일

1번과 쿼리구문은 동이하고요. 레코드셋의 AbsolutePage를 이용해서 페이징을 했습니다.

3. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]

WHERE [글번호필드] NOT IN (SELECT TOP [제거할 게시물수] [글번호필드] FROM [테이블명])
예전에 태요 사이트에서 보았던 쿼리 구문입니다.. NOT IN 때문에.. 문제시 되었던 쿼리구문이죠.

4. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]
WHERE [글번호] IN (SELECT TOP [페이지출력 갯수] [글번호] FROM
(SELECT TOP [불러올 총 게시물수] [글번호] FROM [테이블 명]) AS A ORDER BY [글번호])
ORDER BY [글번호] DESC

이 쿼리 구문은 3번의 쿼리 구문의 문제점을 보완한 구문입니다. NOT IN 대신에 IN을 사용 했습니다.

5. SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블 명]
WHERE [글번호] <= (SELECT MIN([글번호])
FROM (SELECT TOP [제거할 게시물수] + 1 [글번호] FROM [테이블명]) AS A)

5번째 쿼리 구문은 IN, NOT IN이 아닌 출력할 마지막 글번호 바로 앞이 글번호를 찾아서 처리를 해주는
쿼리 구문입니다.

6. SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블명]
WHERE [글번호] <= (SELECT MIN([글번호])
FROM (SELECT TOP [제거할 게시물수] + 1 [글번호]
FROM [테이블명] WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]) AS A
WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호])
AND [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]

6번재 쿼리는.. 글에 인덱스(가칭)라는 필드를 하나 더 추가 해서.. 글 기본 2000개마다 (가변적입니다)
인덱스를 증가 시켰습니다. 즉 2000개를 하나의 묶음으로 만든것입니다.
그 인덱스를 기준으로 처리를 해주었습니다.(기본 개념은 영어 사전 입니다 ㅡㅡ;)


위와 같이 간단한 기본 쿼리 구문을 설명? 했습니다.
게시물은 100만개를 넣고 테스트를 했습니다.
테스트 게시판을 보시려면.. 맨위에 각 게시판을 링크를 걸었습니다.
서버가 구려서.. 제대로 될지 모르지만..
제 노트북
(CPU : p4-1.8, RAM : 768Mb, 컴팩 프리자리오 2820AP, 환경 : 윈도우2003 MSSQL2000)
에서 테스트 해본 봐로는 처음페이지(1), 마지막 페이지(50000) 처리 시간이 아래와 같습니다.(단위 ms)

1 : 320 12289.06
2 : 273 11476.56
3 : 289 4406.25
4 : 289 2695.31
5 : 289 1218.75
6 : 7.81 23.44

엄청난 차이가 나죠??
기본적으로 글번호에 Clustered Index, 인덱스번호, 글깊이에 Non Clustered Index를 걸어 두었습니다.
엄청난 차이로 인해 테스트로 만든 저 또한 입이 쩍 벌어 집니다 ㅡㅡ;;

위 페이징 로직은 여기 저기서 줏어 듣고 ㅡㅡ; 확장 시킨 것입니다.

제가 내공 수위가 낮은 관계로 정확한 테스트를 행했는지 모르지만..
페이징으로 고생하시는 분들을 위해.. 간략하게 만들어 봤습니다.

기본 테스트는 제 홈페이지에서 해보시면 되구요.

테스트 페이지는 [http://www.knhead.pe.kr/PagingTest/] 입니다.

테스트 asp파일은 [이곳]에서 다운 받을수 있습니다.

제 홈에 있는 페이징 방법이 6번의 인덱스와 not in 으로 만들었습니다.
(그때는 걍.. 2000개 안쪽에서 처리 해주는 것이라 not in을 썻습니다 게시판이 필요 하시면..
다운 받으셔서 저장 프로시저늬 리스트 부분을 수정 하시면. .더욱 쾨적하게 사용 하실수 있을것입니다)

p.s 서버가 구려서 노트북 보다는 성능이 낮게 나오네요. ㅡㅡ;
궁금하신 점이나 문의 사항은 제 홈페이지의 테스트 게시판 버그 리포트에 적어 주시기 바랍니다

출처 : http://blog.naver.com/duraboys
반응형

'db > mssql' 카테고리의 다른 글

mssql server 2014, 2016 timezone  (0) 2023.12.26
MSSQL inet_ntoa, inet_aton  (0) 2012.02.14
ms-sql 일반정보 질의 query  (0) 2008.12.29
[MSSQL] Identity 자동 증가함수  (0) 2008.10.16
mssql 인덱스  (0) 2006.09.22