2014. 9. 10. 19:00

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)

이렇게 됩니다.

 

 

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

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

 

마무리

본격적인 내용은 다음 포스팅에서 이어집니다.