320x100
반복 액세스 피하기
일일 구매로그 데이터 중 아래 통계를 구하자
1. 캐쉬 구매에 성공한 유저 수
2. 인게임 머니로 구매에 성공한 유저 수
3. 쿠폰을 이용하여 구매에 성공한 유저 수
변경 전
SELECT
@CASH_COUNT = COUNT(*)
FROM
구매로그
WHERE
BUY_CODE = @캐쉬구매 AND
LOG_DATE >= @어제새벽 AND
LOG_DATE < @오늘새벽;
SELECT
@COUPON_COUNT = COUNT(*)
FROM
구매로그
WHERE
BUY_CODE = @쿠폰구매 AND
LOG_DATE >= @어제새벽 AND
LOG_DATE < @오늘새벽;
SELECT
@INGAME_COUNT = COUNT(*)
FROM
구매로그
WHERE
BUY_CODE = @인게임구매 AND
LOG_DATE >= @어제새벽 AND
LOG_DATE < @오늘새벽;
변경 후
SELECT
@CASH_COUNT = COUNT(CASE WHEN BUY_CODE = @캐쉬구매 THEN USERUID END),
@COUPON_COUNT = COUNT(CASE WHEN BUY_CODE = @쿠폰구매 THEN USERUID END),
@INGAME_COUNT = COUNT(CASE WHEN BUY_CODE = @인게임구매 THEN USERUID END)
FROM
구매로그
WHERE
BUY_CODE IN (@캐쉬구매, @쿠폰구매, @인게임구매) AND
LOG_DATE >= @어제새벽 AND
LOG_DATE < @오늘새벽;
특정유저의 만료된 경매 데이터 삭제
1. 등록 후 24시간 동안 입찰이 없다면 만료
2. 삭제 전 경매이력 데이터 필요
3. 단, 유저가 하루 동안 경매장에 등록 가능한 아이템 수는 제한됨
변경 전
-- 만료 경매 데이터 1건 SELECT
SELECT TOP 1
@ACTION_ID = AuctionId
@등록자 = SELLERUSERUID
@만료일자 = EXPDT
FROM
경매장
WHERE
SELLUSERUID = @등록자 AND
EXPDT <= @현재시간
ORDER BY
ActionId ASC;
-- 경매이력 INSERT
INSERT INTO
경매이력 (ActionId, SELLERUSERUID...)
VALUES
(@ActionId, @등록자...);
-- 만료경매 DELETE
DELETE FROM
경매장
WHERE
ActionId = @ACTION_ID;
변경 후
DELETE TOP (@N)
OUTPUT
DELETE.ActionID, DELETED.SELLERUSERUID
INTO
경매이력
FROM
경매장
WHERE
SELLERUSERUID = @등록자 AND
EXPDT <= @현재시간;
부분 범위 처리
특정 유저의 구매 여부 확인 쿼리
변경 전
SELECT
@SELECTCNT = COUNT(*)
FROM
구매기록
WHERE
USERID = @등록자 AND
LOGDATE >= @어제;
변경 후
IF EXISTS (SELECT 1 FROM 구매기록 WHERE USERID = @등록자 AND LOGDATE >= @어제)
출처: http://ndcreplay.nexon.com/NDC2015/sessions/NDC2015_0015.html
320x100
'NDC > DB' 카테고리의 다른 글
[NDC 2015] 레디스를 활용한 분산 게임 서버 구현 (0) | 2023.01.09 |
---|---|
[NDC 2015] 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현 (0) | 2023.01.09 |
[NDC 2014] 데이터베이스에서 데드락이란 무엇인가? (사례 포함) (0) | 2022.12.25 |
[NDC 2014] 라이브 상황에서 윈도우 서버 개발자가 겪은 좌충우돌 Redis 적용 경험담 (0) | 2021.12.25 |
[NDC 2013] 게임속에서의 NoSQL 활용하기 (0) | 2021.12.01 |