관리 메뉴

웹개발자의 기지개

[MS-SQL] 페이징 쿼리문 리스트 목록처리 - 다중쿼리, 저장프로시저 본문

SQL/MS-SQL

[MS-SQL] 페이징 쿼리문 리스트 목록처리 - 다중쿼리, 저장프로시저

http://portfolio.wonpaper.net 2022. 10. 19. 01:29

보통의 경우  Select 문 형식으로 List 목록을 뽑아 올때, 구간을 나누어 페이징 처리를 한다.

 

페이징의 기법들을 몇가지 생각해 보았다. 

 

데이터베이스에 따라서 끊어서 읽어오는 페이징 방식이 다르겠지만

mysql  은 limit 문으로 간단히 읽어 올수 가 있다.

 

하지만 MS-SQL 의 경우 limit 가 없고, top 형식을 이용하기 때문에 아래와 같은 방식으로 처리할 수 있다.

 

1. 다중 쿼리방식

 

http://wonpaper.net/Blog_view.aspx?tb=board_aspnet&no=2 

 

Wonpaper 웹개발자의 닷넷블로그

게시판 목록을 뿌려줄때 언제나 고민하게 되는 사항이다. (MS-SQL 기준) 꼭 알자 !! 1. select * from board --> 누구나 익숙한 목록 쿼리다 2. SELECT TOP @PageSize * FROM board        WHERE no NOT IN          

wonpaper.net

 

 

@iPage 페이지번호

@PageSize 페이지크기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  SELECT TOP @PageSize * FROM board 
      WHERE no NOT IN
             (SELECT TOP (@iPage * @PageSize) no  FROM board 
             ORDER BY no ASC)
      ORDER BY no ASC
 
 
 
    SELECT TOP 10 * FROM board 
      WHERE no NOT IN
            (SELECT TOP 0 no FROM board 
             ORDER BY no ASC)
      ORDER BY no ASC 
 
 
 
    select * from board
         where thread in
             ( select top 20 thread from
                  ( select top 1020 thread from board
                    order by thread desc ) as a 
         order by thread asc )
     order by thread desc
cs

 

 

 

2. 저장프로시저의 Offset Rows Fetch Next 문으로 처리

https://github.com/VisualAcademy/Answers/blob/master/MemoEngine.Database/Answers/dbo/Stored%20Procedures/Answers/AnswersList.sql

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE PROCEDURE [dbo].[AnswersList]
    @PageNumber Int = 1,
    @PageSize Int = 10
AS
    Select 
        [Id], 
        [Name], 
        [Email], 
        [PostDate], 
        [PostIp], 
        [Title], 
        [Category], 
        [ReadCount], 
        [FileName], 
        [FileSize], 
        [DownCount], 
        [CommentCount], 
        [Step]
    From Answers
    Order By Ref Desc, RefOrder Asc
    Offset ((@PageNumber - 1* @PageSize) Rows Fetch Next @PageSize Rows Only;
cs

 

역시나 저장프로시저의 속도가 어마무시하므로 저장프로시저 방식을 추천한다.

 

Comments