성적 top5
id |
성적 |
A |
95 |
B |
100 |
C |
90 |
D |
85 |
E |
95 |
위 테이블은 전체 성적테이블 중 TOP5만 따로 뽑은 것입니다. 성적이
수정될 때 마다 TOP5의 테이블도 수정을 해야하는데
아래와 같은 상황이 있을 수가 있습니다.
상황1> 테이블에 id가 존재하면 그 id의 성적을 업데이트(예. C의
성적이 95가 되면 C의 성적을 95으로 수정)
상황2> TOP5에 없던 F의 성적이 95가 되면, F를 테이블에
추가하고 성적이 제일 좋지 않은 D를 테이블에서 삭제
예외> 1.E의 성적이 75점이 되었고 순위 6등인 id의 성적이
80점이었다면 E를 테이블에서 삭제하고 6등인 id를 top5에 추가하는
것은 고려하지 않음
2. SORT 는 필요없음
위 상황을 바탕으로 아래와 같은 프로시저를 만들었습니다.
(T-SQL)
CREATE PROC [TOP5]
@id INT,
@score int
as
SELECT @temp = id FROM top5 WHERE id=@id
IF @temp<>NULL
BEGIN
UPDATE top5 SET id=@id, score=@score WHERE id=@id
END
ELSE
BEGIN
INSERT INTO top5(id,score) VALUES(@id, @score)
DELETE FROM top5 WHERE score IN (SELECT TOP 1 score FROM top5
ORDER BY score asc)
END
이것을 1000개 데이터생성해서 돌렸더니 40초가 넘게 걸립니다. 물론
랜덤 데이터를 생성하면서 위 프로시저를 함께 돌리긴 했지만
시간이 너무 오래걸립니다.
위 쿼리를 좀더 향상시킬 방법이 없습니까?
|