database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 1345 게시물 읽기
No. 1345
퍼포먼스를 높이는 쿼리...
작성자
김명섭
작성일
2004-05-22 15:20
조회수
4,643

성적 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초가 넘게 걸립니다. 물론 랜덤 데이터를 생성하면서 위 프로시저를 함께 돌리긴 했지만

시간이 너무 오래걸립니다.

위 쿼리를 좀더 향상시킬 방법이 없습니까?

이 글에 대한 댓글이 총 2건 있습니다.


일단 내용을 고친다면..
아래과 같이 고치시던가..

   UPDATE top5 SET score = @score WHERE id = @id

   IF @@rowcount = 0
   BEGIN
      DELETE FROM top5 WHERE id = (SELECT TOP 1 id FROM top5 ORDER BY score asc)
      INSERT INTO top5(id,score) VALUES(@id, @score)
   END
  
아니면 기본적은 내용은 그냥 두고 위의 내용중에
1.UPDATE 시 불필요하게 id를 업데이트하는 부분에서 점수만 수정
2.삭제시 제일작은 점수를 가지고 업데이트하는 것 보다는
  제일 작은 점수를 가진 사람의 id로 삭제하는 것이 효율적이겠죠.
  불필요한 in 도 = 로 고치시고..
 

근데 말씀드리고 싶은 것은
위에서 말씀하신 의도가 무엇인지 궁금합니다.
1.단순히 상위 5명만 관리하겠다면 뷰나 이런 것으로 관리하는게 낫지 않을지..
하긴 이것은 위에서 말씀하신..<예외>때문에 안되겟군요.
예외는 전반적으로 기본로직에 안 맞는 거 같은데 왜 필요할지?

2.만약 변경사항이 필요하다면
이력관리를 해야 되는 것이 아닌지..
기간별 상위5명으로 말이죠..


아래 드린 말씀은 단지 제 상식으로 드린 것입니다.
말씀하신 부분이 원래 로직은 훨씬 더 잘 아실테니
위와 같은 방법을 사용할 수 있겠죠..

그럼.. ^^

sql님이 2004-05-23 11:25에 작성한 댓글입니다. Edit

답변 감사합니다. 많은 도움이 되었습니다.

김명섭님이 2004-05-24 13:46에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1349ms-sql 2000을 설치했더니 이상하게 안되네요...
사형
2004-05-25
2319
1347쿼리분석기 실행이 안됩니다
김정이
2004-05-24
2451
1346작업일정을 다른 데이터베이스 서버로 가져오는 방법은?
소리
2004-05-24
2665
1345퍼포먼스를 높이는 쿼리... [2]
김명섭
2004-05-22
4643
1344datetime에 null값으로 저장할려고 하는데...도와주세요 [2]
레오
2004-05-22
4678
1343MS-SQL과 Oracle 연동 관련 질문
사람
2004-05-21
6595
1342[질문]MYSQL설치했는데 실행이 안됩니다.T-T
윤세민
2004-05-21
2686
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다