기능에 대해서 설명드리면 "랜던길드" 버튼을 클릭하면 임의로 블로그를 선택해주는 것입니다.
해당 기능 중 여기서 테스트할 내용은 랜덤하게 블로그의 번호를 찾는 부분에 대해서 이야기하려고 합니다.
구현 방식에는 여러가지가 있겠지만 많이 사용하는 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-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. 의견
> 조금만 응용하면 다양한 서비스에 활용이 가능합니다. (로터리 아이템 구현 등 랜덤이 들어가는 기능들...)
> 새로운 기능 구현을 고려할 때 반드시 성능 부하가 높지 않을지 확인/검토하시기를 권장드립니다.