, ,

MSSQL에서 페이징 처리는 여러 가지로 귀찮습니다.

MSSQL 2012버전부터는 어느 정도 간단하게 처리할 수 있도록 오프셋(OFFSET)을 지원하긴 하는데....성능이-_-;

 

어찌 됐건 예전에 만들어둔 페이징 쿼리가 너무 느려 이상해서 이것저것 테스트 하다 보니 이 기회에 정리 좀 해야겠다 싶어 포스팅을 시작합니다. ㅎㅎㅎ

 

MSSQL에서 사용할 수 있는 페이징 쿼리를 소개하고 속도, 유지 보수성 등의 몇 가지 중요하다고 생각되는 요소를 주관적으로 평가해보겠습니다.

 

 

1. 테스트 DB만들기

테스트를 위해 테스트용 DB를 만들 겠습니다.

 

1-1. DB생성

테스트용 DB의 이름은 'TestDB'입니다.

 

 

1-2. 테이블 생성

테이블은 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

 

2. 데이터 입력

'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(*)'를 이용해 개수를 확인합시다.

 

 

3. 데이터 확인

이제 데이터 갯수를 확인 해봅시다.

 

 

이렇게 데이터가 생성되었으면 테스트용 DB는 완성입니다.

이제 다음글 부터는 각 쿼리를 분석해 봅시다.

 

 

4. 원하는 결과물

원하는 결과는 페이징에서 필수로 필요한 요소들을 출력하기 위해 두개의 테이블이 출력되고 시간체크를 위한 코드를 추가하여 간단하게 코드를 확인 하겠습니다.

 

그러니까 출력되는 내용은

 

게시물 정보 : 검색된 총 게시물 개수, 검색된 총 페이지 개수

페이지 데이터 : 한 페이지에 출력되는 게시물의 데이터

쿼리를 실행에 걸린 시간 : 밀리세컨드(ms)

 

이렇게 됩니다.

 

 

이런 결과가 필요한 이유는 페이징의 주목적이 게시판형태의 데이터다 보니 게시판정보도 만들어야 하기 때문입니다.

이것때문에 중복된 코드가 필요한 경우도 있죠.

 

 



 

 

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바