이 글을 작성한 목적은 일정 기간동안 컬럼의 값을 증가시키다가 일정기간마다 초기화가 필요한 경우에 활용하면 좋을 듯 하여
블로그 일간 방문자수 보여주기 기능을 사례로 들어서 테스트해 본 것입니다.
원활한 테스트를 위해서 “일간 방문자수 보여주기” 기능에 대한 정의는 아래와 같이 단순화하겠습니다.
1. 임의의 사용자가 블로그에 방문하면 일간 방문자수를 +1 증감시켜준다.
2. 날짜가 변경되면 일간 방문자수를 0으로 초기화되며, 새로 방문자가 올 경우 1로 보여준다.
3. 이전날짜의 방문자수를 따로 보여주지 않는다.
제가 생각해 본 이 방식의 장점은 아래와 같습니다.
1. 매일 0시에 대량의 업데이트를 할 필요가 없다.
2. 접근이 없는 블로그에 대해서는 불필요한 업데이트를 하지 않아도 된다.
3. 웹서비스의 경우 불특정 다수를 상대로 서비스하기 때문에, 사용자가 많아짐에 따라서 순간적인 병목이 발생할 수 있는데요.
필요한 경우에만 데이터를 업데이트 함으로써 부하를 분산할 수 있습니다.
그럼 이제 테스트를 진행하도록 하겠습니다.
use tempdb
go
-- @@ 예제 테이블 생성 및 데이터 추가
drop table BlogMainTable
create table BlogMainTable (
blogId varchar(50) -- 블로그이름
, VisitorCount int -- 오늘 블로그에 방문한 방문자수
, lastModified datetime -- 블로그 최종데이터 변경일자
)
insert into BlogMainTable values ( 'Blog_01', 5, getdate() - 1 ) -- 어제 50명이 방문하고 오늘 방문자가 없는 블로그
insert into BlogMainTable values ( 'Blog_02', 10, getdate()) -- 오늘 10명이 방문한 블로그
-- @@ 어제 방문자가 5명이였고, 오늘 방문자가 없는 블로그 조회 쿼리
select
blogId
, VisitorCount as VisitorCount_real
, case
when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) < DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then 1 -- 최종변경일시가 어제라면 1을 보여줌
when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) = DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then VisitorCount -- 최종변경일시가 오늘이면 +1된 건수를 보여줌
else 0
end as VisitorCount_view
, lastModified
from BlogMainTable
where blogId = 'Blog_01'
-- @@ 오늘 10명이 방문한 블로그
select
blogId
, VisitorCount as VisitorCount_real
, case
when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) < DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then 1 -- 최종변경일시가 어제라면 1을 보여줌
when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) = DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then VisitorCount -- 최종변경일시가 오늘이면 +1된 건수를 보여줌
else 0
end as VisitorCount_view
, lastModified
from BlogMainTable
where blogId = 'Blog_02'
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- @@ 실제 적용시에는 업데이트와 조회를 한방에 처리하면 좀 더 비용을 절감할 수 있습니다.
-- @@ 업데이트와 조회를 한번에 처리하는 예제는 아래와 같습니다.
declare
@blogId varchar(50)
, @VisitorCount_before int = 0
, @VisitorCount_view int = 0
, @lastModified datetime
-- 현재 테이블에 저장된 데이터 확인
select * from BlogMainTable where blogId = 'Blog_01'
-- 데이터 변경하기
update bm
set
@blogId = blogId
, @VisitorCount_view = VisitorCount = case
when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) < DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then 1 -- 지난달의 기록이면 노출
when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) = DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then VisitorCount + 1 -- 이번달의 Sum이면 합계금액 노출
else 0
end
, @lastModified = lastModified = getdate()
from BlogMainTable as bm
where blogId = 'Blog_01'
-- 업데이트된 결과 확인(Blog_01의 경우 어제일자이므로 1로 변경됨)
select @blogId as blogId , @VisitorCount_view as VisitorCount_view, @lastModified as lastModified