2006/04/24 09:52 Developer
MSSQL에서 페이징 처리
그냥 쿼리를 사용할 경우와 SP를 사용할 경우 가장 퍼포먼스가 뛰어난 query or Best Practice를 찾기 위해서 네이버와 구글검색엔진에서 검색한 결과를 참조하고 테스트를 진행해 보려 한다.
1. 네이버에서 검색을 해봤다
MSSQL 페이징 처리
http://blog.naver.com/ifuture74/60008703576
SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블명]
WHERE [글번호] <= ( SELECT MIN([글번호])
FROM ( SELECT TOP [제거할 게시물수] + 1 [글번호]
FROM [테이블명] WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호] ) AS A
WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호] )
AND [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]
그리고, 아래와 같은 방법도 있다.
페이징에대한 엔코아거 소개
http://blog.naver.com/locusty/80014513540
2. 여기부터는 구글신과 함께 검색을~~
Paging in MSSQL
http://lejalgenes.com/techtips/tips/Microsoft_SQL_Server/Paging_in_MSSQL.php
--> 이 방법은 not in 1번, order by 2번 실행이 되었다. 대용량에서는는 비추!!
Paging results in MS SQL Server
http://josephlindsay.com/archives/2005/05/27/paging-results-in-ms-sql-server/
--> 이것은 내가 쓰는 방식하고 똑같지 않은가? 오라클에서 페이징 처리할 때 rownum을 이용해서 비슷하게 쿼리를 작성을 했었다. 오라클에서는 hint를 사용해서 order by 에 대한 비용을 최소화 했는데, MSSQL은 order by를 두번 사용하는 비용이 만만치는 않다.
다양한 덧글들이 올라왔으나, not in을 사용한 것은 일단 무시하기로 하고, 최고의 복잡도를 자랑하는 not in을 웬간해서는 사용하면 안된다.
테스트
나도 백만건 정도 입력을 하고, 테스트를 해보려고 한다...^^
* 기존 오라클을 사용할 때의 습성에 따라 josephlindsay와 같은 쿼리 구조를 사용을 했다. order by를 2번 사용했지만, 인덱스가 걸린 필드를 사용한다면 만족할 만한 성능이 나올거라는 생각이다.
1. 네이버에서 검색을 해봤다
MSSQL 페이징 처리
http://blog.naver.com/ifuture74/60008703576
게시물은 100만개를 넣고 테스트를 했습니다.이게 high 퍼포먼스의 6번 쿼리 내용이다. 이 결과를 보면 무조건 6번을 선택해야 한다.
테스트 게시판을 보시려면.. 맨위에 각 게시판을 링크를 걸었습니다.
서버가 구려서.. 제대로 될지 모르지만..
제 노트북
(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
SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블명]
WHERE [글번호] <= ( SELECT MIN([글번호])
FROM ( SELECT TOP [제거할 게시물수] + 1 [글번호]
FROM [테이블명] WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호] ) AS A
WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호] )
AND [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]
그리고, 아래와 같은 방법도 있다.
페이징에대한 엔코아거 소개
http://blog.naver.com/locusty/80014513540
2. 여기부터는 구글신과 함께 검색을~~
Paging in MSSQL
http://lejalgenes.com/techtips/tips/Microsoft_SQL_Server/Paging_in_MSSQL.php
--> 이 방법은 not in 1번, order by 2번 실행이 되었다. 대용량에서는는 비추!!
Paging results in MS SQL Server
http://josephlindsay.com/archives/2005/05/27/paging-results-in-ms-sql-server/
--> 이것은 내가 쓰는 방식하고 똑같지 않은가? 오라클에서 페이징 처리할 때 rownum을 이용해서 비슷하게 쿼리를 작성을 했었다. 오라클에서는 hint를 사용해서 order by 에 대한 비용을 최소화 했는데, MSSQL은 order by를 두번 사용하는 비용이 만만치는 않다.
다양한 덧글들이 올라왔으나, not in을 사용한 것은 일단 무시하기로 하고, 최고의 복잡도를 자랑하는 not in을 웬간해서는 사용하면 안된다.
SELECT * FROM ( SELECT TOP x * FROM (
SELECT TOP y fields
FROM table
WHERE conditions
ORDER BY table.field ASC) as foo
ORDER by field DESC) as barORDER by field ASC
테스트
나도 백만건 정도 입력을 하고, 테스트를 해보려고 한다...^^
* 기존 오라클을 사용할 때의 습성에 따라 josephlindsay와 같은 쿼리 구조를 사용을 했다. order by를 2번 사용했지만, 인덱스가 걸린 필드를 사용한다면 만족할 만한 성능이 나올거라는 생각이다.