NDC/DB

[NDC 2015] 이 쿼리를 어떻게 짜야 잘 짰다고 소문이 날까?

MAKGA 2023. 1. 6. 13:00
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