Classic ASP
100만건을 대상으로 테스트를 해 보았습니다.
NJHouse
2015. 5. 24. 14:20
반응형
전체 게시판 목록을 100만건을 대상으로 테스트를 해 보았습니다.
1. select * from BBS_T 후에 프로그램에서 cursor fetch를 사용하는 방법
2. select top 게시물 숫자 from BBS_T 를 이용하는 방법
1번과 2번은 상당히 큰 속도의 차이를 보입니다.
이유는 resultset 의 객체를 얻을때 이미 모든 자료를 가지고 오기에
Databaes에서 자료를 가지고 올때 원하는 부분만 filtering에서 자료를 가지고 오는 것이
훨씬 속도면에서 탁월함을 느낄 수 있더군요.
이와 같은 특징을 살려서 만든 sp_bbs_list 입니다.
-- Table 생성
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[NORM_BBS_T]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[NORM_BBS_T]
GO
CREATE TABLE [dbo].[NORM_BBS_T] (
[NO] [int] IDENTITY (1, 1) NOT NULL ,
[ID] [varchar] (10) COLLATE Korean_Wansung_CI_AS NULL ,
[NAME] [varchar] (10) COLLATE Korean_Wansung_CI_AS NULL ,
[EMAIL] [varchar] (100) COLLATE Korean_Wansung_CI_AS NULL ,
[SUBJECT] [varchar] (100) COLLATE Korean_Wansung_CI_AS NOT NULL ,
[CONTENT] [text] COLLATE Korean_Wansung_CI_AS NOT NULL ,
[REGI_DATE] [smalldatetime] NOT NULL ,
[IP] [varchar] (15) COLLATE Korean_Wansung_CI_AS NOT NULL ,
[CNT] [int] NOT NULL ,
[GROUP_ID] [int] NOT NULL ,
[GROUP_ORDER] [int] NOT NULL ,
[DEPTH] [int] NOT NULL ,
[PWD] [varchar] (10) COLLATE Korean_Wansung_CI_AS NULL ,
[HTML_F] [char] (1) COLLATE Korean_Wansung_CI_AS NULL ,
[SHOW_F] [char] (1) COLLATE Korean_Wansung_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
-- sp_bbs_list
*
게시판 리스트꺼내기(답변)
pagesize : 한번에보여줄게시판리스트수
GotoPage :현재페이지
recordcount : 전체 레코드 수
tbn:테이블이름
where: where 절
*/
CREATE PROCEDURE dbo.sp_bbs_list
@pagesize varchar(3),
@GotoPage varchar(8),
@recordcnt varchar(8),
@tbn varchar(20),
@where varchar(200)
AS
begin
declare @sql varchar(2000), @num varchar(8),@total varchar(8)
if cast(@recordcnt as int) > cast(@gotopage as int)*cast(@pagesize as int)
set @total=@pagesize
else
set @total=cast(cast(@recordcnt as int)-(cast(@gotopage as int)-1)*cast
(@pagesize as int) as varchar(8))
set @num=cast(cast(@gotopage as int)*cast(@pagesize as int) as varchar(8))
set @sql='
SELECT
NO,ID,NAME,EMAIL,SUBJECT,'''' AS CONTENT,REGI_DATE,IP,CNT,
GROUP_ID,DEPTH,GROUP_ORDER,PWD,HTML_F,SHOW_F From
(
SELECT Top '+@total +' * FROM ( Select Top '+@num +' * From ' + @tbn + ' ' + @where
+ ' ORDER BY GROUP_ID DESC, GROUP_ORDER ASC ) a '
+ @where + ' ORDER BY GROUP_ID ASC, GROUP_ORDER DESC ) a '+@where
+ ' ORDER BY GROUP_ID DESC, GROUP_ORDER ASC '
exec(@sql)
end
GO
-- 실행
Query Analyzer에서
exec sp_bbs_list '10','2','1000','NORM_BBS_T',''
한번씩 모두 분석해 보세요.
(추가)
한가지 빠져서 추가합니다.
100만건을 입력하는 것은 힘들져 이때 T_SQL 을 이용하면 됩니다.
그런데 100만건은 진짜 시간 많이 걸릴 겁니다.. 한 10만건~20만건 정도로 하심이... ㅋㅋ
쿼리 Analyzer 에서 아래 라인을 실행합니다.
set nocount on
declare @i int
set @i = 1
while @i < 1000000
begin
INSERT INTO NORM_BBS_T
(ID,NAME,EMAIL,SUBJECT,CONTENT,REGI_DATE,IP,CNT,GROUP_ID,DEPTH,
GROUP_ORDER,PWD,HTML_F,SHOW_F) VALUES
('kingches','왕장기','kingches@dddd.com','제목이당.. ㅋㅋㅋㅋ' + str(@i),'내용이당 ㅋㅋㅋ 나두몰라',
getdate(), '11.111.111.11',0,@i, 0, 0, '1111','0','1')
set @i = @i + 1
end
go
그럼..
1. select * from BBS_T 후에 프로그램에서 cursor fetch를 사용하는 방법
2. select top 게시물 숫자 from BBS_T 를 이용하는 방법
1번과 2번은 상당히 큰 속도의 차이를 보입니다.
이유는 resultset 의 객체를 얻을때 이미 모든 자료를 가지고 오기에
Databaes에서 자료를 가지고 올때 원하는 부분만 filtering에서 자료를 가지고 오는 것이
훨씬 속도면에서 탁월함을 느낄 수 있더군요.
이와 같은 특징을 살려서 만든 sp_bbs_list 입니다.
-- Table 생성
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[NORM_BBS_T]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[NORM_BBS_T]
GO
CREATE TABLE [dbo].[NORM_BBS_T] (
[NO] [int] IDENTITY (1, 1) NOT NULL ,
[ID] [varchar] (10) COLLATE Korean_Wansung_CI_AS NULL ,
[NAME] [varchar] (10) COLLATE Korean_Wansung_CI_AS NULL ,
[EMAIL] [varchar] (100) COLLATE Korean_Wansung_CI_AS NULL ,
[SUBJECT] [varchar] (100) COLLATE Korean_Wansung_CI_AS NOT NULL ,
[CONTENT] [text] COLLATE Korean_Wansung_CI_AS NOT NULL ,
[REGI_DATE] [smalldatetime] NOT NULL ,
[IP] [varchar] (15) COLLATE Korean_Wansung_CI_AS NOT NULL ,
[CNT] [int] NOT NULL ,
[GROUP_ID] [int] NOT NULL ,
[GROUP_ORDER] [int] NOT NULL ,
[DEPTH] [int] NOT NULL ,
[PWD] [varchar] (10) COLLATE Korean_Wansung_CI_AS NULL ,
[HTML_F] [char] (1) COLLATE Korean_Wansung_CI_AS NULL ,
[SHOW_F] [char] (1) COLLATE Korean_Wansung_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
-- sp_bbs_list
*
게시판 리스트꺼내기(답변)
pagesize : 한번에보여줄게시판리스트수
GotoPage :현재페이지
recordcount : 전체 레코드 수
tbn:테이블이름
where: where 절
*/
CREATE PROCEDURE dbo.sp_bbs_list
@pagesize varchar(3),
@GotoPage varchar(8),
@recordcnt varchar(8),
@tbn varchar(20),
@where varchar(200)
AS
begin
declare @sql varchar(2000), @num varchar(8),@total varchar(8)
if cast(@recordcnt as int) > cast(@gotopage as int)*cast(@pagesize as int)
set @total=@pagesize
else
set @total=cast(cast(@recordcnt as int)-(cast(@gotopage as int)-1)*cast
(@pagesize as int) as varchar(8))
set @num=cast(cast(@gotopage as int)*cast(@pagesize as int) as varchar(8))
set @sql='
SELECT
NO,ID,NAME,EMAIL,SUBJECT,'''' AS CONTENT,REGI_DATE,IP,CNT,
GROUP_ID,DEPTH,GROUP_ORDER,PWD,HTML_F,SHOW_F From
(
SELECT Top '+@total +' * FROM ( Select Top '+@num +' * From ' + @tbn + ' ' + @where
+ ' ORDER BY GROUP_ID DESC, GROUP_ORDER ASC ) a '
+ @where + ' ORDER BY GROUP_ID ASC, GROUP_ORDER DESC ) a '+@where
+ ' ORDER BY GROUP_ID DESC, GROUP_ORDER ASC '
exec(@sql)
end
GO
-- 실행
Query Analyzer에서
exec sp_bbs_list '10','2','1000','NORM_BBS_T',''
한번씩 모두 분석해 보세요.
(추가)
한가지 빠져서 추가합니다.
100만건을 입력하는 것은 힘들져 이때 T_SQL 을 이용하면 됩니다.
그런데 100만건은 진짜 시간 많이 걸릴 겁니다.. 한 10만건~20만건 정도로 하심이... ㅋㅋ
쿼리 Analyzer 에서 아래 라인을 실행합니다.
set nocount on
declare @i int
set @i = 1
while @i < 1000000
begin
INSERT INTO NORM_BBS_T
(ID,NAME,EMAIL,SUBJECT,CONTENT,REGI_DATE,IP,CNT,GROUP_ID,DEPTH,
GROUP_ORDER,PWD,HTML_F,SHOW_F) VALUES
('kingches','왕장기','kingches@dddd.com','제목이당.. ㅋㅋㅋㅋ' + str(@i),'내용이당 ㅋㅋㅋ 나두몰라',
getdate(), '11.111.111.11',0,@i, 0, 0, '1111','0','1')
set @i = @i + 1
end
go
그럼..
반응형