MSSQL에서 페이징 처리는 여러 가지로 귀찮습니다.
MSSQL 2012버전부터는 어느 정도 간단하게 처리할 수 있도록 오프셋(OFFSET)을 지원하긴 하는데....성능이-_-;
어찌 됐건 예전에 만들어둔 페이징 쿼리가 너무 느려 이상해서 이것저것 테스트하다 보니 이 기회에 정리 좀 해야겠다 싶어 포스팅을 시작합니다. ㅎㅎㅎ
MSSQL에서 사용할 수 있는 페이징 쿼리를 소개하고 속도, 유지 보수성 등의 몇 가지 중요하다고 생각되는 요소를 주관적으로 평가해보겠습니다.
테스트를 위해 테스트용 DB를 만들겠습니다.
테스트용 DB의 이름은 'TestDB'입니다.
테이블은 2개를 생성합니다.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tb_BigData1](
[nIndex] [int] IDENTITY(1,1) NOT NULL,
[Data1] [nvarchar](128) NULL,
[Data2] [nvarchar](128) NULL,
[Data3] [nvarchar](128) NULL,
[Data4] [int] NULL
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tb_BigData2](
[nIndex] [int] IDENTITY(1,1) NOT NULL,
[Data1] [nvarchar](128) NULL,
[Data2] [nvarchar](128) NULL,
[Data3] [nvarchar](128) NULL,
[Data4] [int] NULL
) ON [PRIMARY]
GO
'tb_BigData1'에는 30만 개의 데이터를 넣고 'tb_BigData2'에는 100만 개의 데이터를 넣겠습니다.
Declare @nCount int = 0;
While @nCount < 300000
Begin
Insert Into tb_BigData2 (Data1
, Data2
, Data3
, Data4)
Values ( 'data1_' + CAST(@nCount AS varchar(8))
, 'data2_' + CAST(@nCount AS varchar(8))
, 'data3_' + CAST(@nCount AS varchar(8))
, @nCount);
Set @nCount = @nCount + 1
End
Declare @nCount int = 0;
While @nCount < 1000000
Begin
Insert Into tb_BigData2 (Data1
, Data2
, Data3
, Data4)
Values ( 'data1_' + CAST(@nCount AS varchar(8))
, 'data2_' + CAST(@nCount AS varchar(8))
, 'data3_' + CAST(@nCount AS varchar(8))
, @nCount);
Set @nCount = @nCount + 1
End
위 코드를 실행하면 한참 데이터를 넣습니다.
잘못하면 타임오버로 쿼리가 실행되다 말 수 있으니 입력이 끝나면 'count(*)'를 이용해 개수를 확인합시다.
이제 데이터 개수를 확인해 봅시다.
이렇게 데이터가 생성되었으면 테스트용 DB는 완성입니다.
이제 다음 글부터는 각 쿼리를 분석해 봅시다.
원하는 결과는 페이징에서 필수로 필요한 요소들을 출력하기 위해 두 개의 테이블이 출력되고 시간 체크를 위한 코드를 추가하여 간단하게 코드를 확인하겠습니다.
그러니까 출력되는 내용은
게시물 정보 | 검색된 총 게시물 개수, 검색된 총 페이지 개수 |
페이지 데이터 | 한 페이지에 출력되는 게시물의 데이터 |
쿼리를 실행에 걸린 시간 | 밀리 세컨드(ms) |
이렇게 됩니다.
이런 결과가 필요한 이유는 페이징의 주목적이 게시판 형태의 데이터다 보니 게시판 정보도 만들어야 하기 때문입니다.
이것 때문에 중복된 코드가 필요한 경우도 있죠.
본격적인 내용은 다음 포스팅에서 이어집니다.