MS-SQL Server

"랜덤블로그 방문" 기능 구현 사례

임현수 2011. 11. 13. 20:13
블로그 사이트에 가면 종종 볼 수 있는 기능인 "랜덤블로그 방문"을 DB에서 구현했던 사례를 소개드립니다.
기능에 대해서 설명드리면 "랜던길드" 버튼을 클릭하면 임의로 블로그를 선택해주는 것입니다.
해당 기능 중 여기서 테스트할 내용은 랜덤하게 블로그의 번호를 찾는 부분에 대해서 이야기하려고 합니다.
구현 방식에는 여러가지가 있겠지만 많이 사용하는 2가지 방식에 대한 테스트를 진행해보고 얼마나 성능 차이가
나는지에 대해서 보도록 하겠습니다.

1. 테스트 환경 구성

-- 테이

create table tbl_Blog (

        SeqNo          int            --

,       name           varchar(1000)  --

,       Contents       varchar(6000)  --

)

 

--

create clustered index idx_Article_seqNo on tbl_Blog (seqNo)

 

-- (6400)

insert into tbl_Blog (SeqNo, name, Contents)

select

        seqNo

,       replicate(seqNo, 50) as title

,       replicate(seqNo, 500) as contents

from (

        select

               row_number() over(order by a.name) as [seqNo]

        from sys.objects a

               cross join sys.objects b ) x

order by seqNo

 

-- 

set statistics io on

2. 테스트
2-1. 방법 1 : newid() 함수 사용

select top 1

        SeqNo

,       name

,       Contents

from (

        select

               seqNo

        ,       name

        ,       Contents

        ,       newid() as RandomID

        from tbl_Blog with (readuncommitted) ) x

order by RandomID


[결과]
-- 반복 실행해보시면 블로그번호가 계속 변경되어지는 것을 볼 수 있습니다.


-- 논리적인 읽기 수가 2048페이지로 높은 것을 볼 수 있습니다.


2-2. 방법 2 : rand() 함수 사용

declare @MaxSeqNo int

 

select top 1

        @MaxSeqNo = seqNo

from tbl_Blog with (readuncommitted)

order by SeqNo desc

 

select top 1

        seqNo

,       name

,       Contents

from tbl_Blog with (readuncommitted)

where SeqNo <= rand() *@MaxSeqNo

order by SeqNo desc


[결과]
-- 반복 실행해보시면 블로그번호가 계속 변경되어지는 것을 볼 수 있습니다.


-- 논리적인 읽기 수가 총 6으로 방법1에 비하여 매우 낮음을 볼 수 있습니다.


3. 의견
   > 조금만 응용하면 다양한 서비스에 활용이 가능합니다. (로터리 아이템 구현 등 랜덤이 들어가는 기능들...)
   > 새로운 기능 구현을 고려할 때 반드시 성능 부하가 높지 않을지 확인/검토하시기를 권장드립니다.