데브피아 SQL Server 에서 퍼왔어요.

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=38&MAEULNo=16&no=37711&ref=37699

질문&답변
 랭킹 테이블을 만들려고 하는데 어떤 방법이 좋은지요?  | Modeling2003-04-29 오후 12:16:17
송현석 (myble)  송현석님께 메시지 보내기송현석님을 내 주소록에 추가합니다.송현석님의 개인게시판 가기번호: 37699  / 읽음:333

 

  점수에 따라 랭킹을 줄려고 하는데 어떻게 하는게 적절한 방법인지.. 어떻게 해야 할까 해서 질문드립니다.

-----------

회원테이블

----------

아이디

이름

점수

 rank

.......

----------

 

위와 같이 테이블이 되어있구여 rank아래로 ....은 그외 여러가지 컬럼이 있습니다.

랭킹 디스플레이에는 아이디 이름 점수 rank만 있음 되구여

회원테이블 자체에 rank를 일정 시점마다 값을 변경시켜주는것이 좋을지

아니면 랭킹테이블을 따로 빼내서 일정 시점마다 랭킹테이블을 만들어주는것이 좋은지요?

 

insert into rank select 아이디,이름,점수 from 회원테이블 order by 점수 desc

이렇게 쿼리를 줘서 새로운 랭킹 테이블을 해주는것이 좋은지.

 

update 회원테이블 set 회원테이블.rank = aa.rank

from 회원테이블, (select b.이름 이름,

                                   b.점수 점수,

                                  (select count(*)+1

                                    from 회원테이블 a

                                    where a.점수 > b.점수) rank

                          from 회원테이블 b ) aa

where 회원테이블.이름 = aa.이름

 

이런방법이 좋을까요? 업데이트쿼리는 게시판에서 찾은 쿼리문입니다.

만약 랭킹을 매겨야 하는것이 10만명 정도이고 하루에 한번씩 랭킹을 다시 매겨줘야 한다면

어떻게 해야 할까요?

위의 두가지 방법외에 다른 방법이 있으면 알려주세요.

첫번째에서

insert를 사용하는 이유는 MSSQL에서 테이블을 복사할수 있는 방법을 찾지 못해서...

create table rank

as

select 아이디,이름, 점수

from 회원테이블

order by 점수 desc;

요런 쿼리문이 먹히지가 않네요.. ㅡㅡ;

랭킹은 수시로 회원들에 의해 조회가 됩니다.

인덱스는 어떻게 해주는것이 성능이 좋아지는지요?  ^^

급하게 만들어야 하는것이라서 질문 올립니다.

도움 부탁드려요

 아참 쿼리문은 일정한 시간에 자동으로 돌릴려고 합니다.

이 글에 답변 등록하기
 [답변][☆]모...... 단순하게.. 복사를 한다면야... 2003-04-30 오전 10:28:13
황순영 (stonefly)  황순영님께 메시지 보내기황순영님을 내 주소록에 추가합니다.황순영님의 개인게시판 가기번호: 37711  

앗... 하루가 지난거 같은데.. 아직도.. 답이 엄네여..^^a (그사이 또 누가 쓸런지도..^^;;)

 

하여가네..

랭킹하는 방법은 여러가지가 있죠.. 카렌 아줌마 Inside SQL 2K 보시면..

랭킹 방법에 대해서.. 3~4가지가 나와 있습니다..

항상 느끼는거지만.. 오라클의 ROWNUM 비스무리한넘 있으면 좋으련만.. 하는 생각과..

8i R2 부터 있는 Analytic Function 있으면 ... 좋겠다는 생각이 매번 듭니다..

하지만 SQL Server에는 이런것이 없기 때문에 모..

있는거 잘 활용해서 써야겠죠..

 

우선.. 테이블 복제인데..

CREATE TABLE 에서 AS로 SELECT 해서 쓰는 문장은 오라클 문법인듯 하네여..^^a

님께서 원하시는 방법으로 SQL 서버에는

 

SELECT * INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC;

 

이렇게 하면 tank 라는 테이블이 만들어 지게 됩니다...

 

만일 위의 것을 이용해서 한다면, 더더군다나 주기적으로 갈아 엎어 져야 한다면..

rank 테이블을 따로 만드는것도 좋을듯하네요...

 

SELECT 아디디,  indentity(int, 1, 1) as rank INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC;

 

라고 하게 되면 점수 순서에 따라 아이디와 랭킹이 매겨 지게 됩니다..

필요할 경우 기존 사용자 정보와 조인해서 가져가면되고 사용자 테이블을 매번 수정안해도 되니까.. 부하를 줄일수 있지만서도, 대번 테이블을 Drop 하고 위의 문장을 실행시켜야하는 문제가 좀 있죠..

또하나의 문제는 동일 점수에 대한 동일 랭킹이 안된다는 문제가 남아 있고요..

님께서 중간에 쓰셨던..

Sunquery를 사용해서 랭킹을 사용하시는게.. 비록 테이블을 두번 읽어야 하는 문제가 있긴하지만...

같은 점수에 대해 동일한 랭킹을 부여할 수 있겠죠..

 

대충.. 이정도...

^^

 

__________________________________________

황순영 (Hwang, Soon-Young), MVP, MCP
Manager of (C)Dotnetsoft

Mobile : 016-745-0297
E-Mail : syhwang@dotnetsoft.co.kr
MSN : stonefly2001@hotmail.com
__________________________________________

이 글에 답변 등록하기
         [답변]SELECT * I...[한줄답변]2003-05-02 오후 3:46:00
송현석번호: 44531  
SELECT * INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC; 이와 같은경우여
이 글에 답변 등록하기
         [답변]복사+컬럼추가가 가...[한줄답변]2003-05-02 오후 3:48:00
송현석번호: 44532  
복사+컬럼추가가 가능한지여? rank라는 컬럼을 rank테이블에 추가해서 순위를 넣을려고 하거든여.
이 글에 답변 등록하기
 [답변]답변2003-04-30 오후 5:45:43
송덕용 (sdyno1)  송덕용님께 메시지 보내기송덕용님을 내 주소록에 추가합니다.송덕용님의 개인게시판 가기번호: 37734  

랭킹을 10만 건

그리고 검색하는 게 많다

 

그렇다면 검색되는 쿼리문이 단순해야겠죠.

방법은 여러가지가 있겠습니다만  (프로시져 , 뷰를 사용해서 한번에 랭킹을 뽑아서 보여주는 방법이 있지많은

권장하고 싶지는 않습니다. 그많큼 비용 소모가 많고 IO를 많이 잡아 먹을테니까요.)

 

저라면 이렇게 하겠습니다.

 

먼저

SELECT * INTO 문을 사용해서 랭킹을 뽑아 랭킹테이블에 쓰는 쿼리가 있는

프로시져를 만들고

매일 하루에 한번씩 JOB 을 돌립니다.

 

유저들이 사용하는 테이블은 최적화된 랭킹 테이블이므로 db에 부담을 주지 않고 사용할 수 있습니다.

이 글에 답변 등록하기
         [답변]답면 감사합니다....[한줄답변]2003-05-02 오후 3:49:00
송현석번호: 44533  
답면 감사합니다.
이 글에 답변 등록하기
         [답변]SELECT * I...[한줄답변]2003-05-02 오후 3:49:00
송현석번호: 44534  
SELECT * INTO rank FROM Table1 WHERE 조건 ORDER BY 점수 DESC; 이와 같은경우여
이 글에 답변 등록하기
         [답변]복사+컬럼추가가 가...[한줄답변]2003-05-02 오후 3:49:00
송현석번호: 44535  
복사+컬럼추가가 가능한지여? rank라는 컬럼을 rank테이블에 추가해서 순위를 넣을려고 하거든여.
이 글에 답변 등록하기
         [답변]만약 불가능할경우 ...[한줄답변]2003-05-02 오후 3:53:00
송현석번호: 44536  
만약 불가능할경우 insert문을 사용하여  select * into을 대체하여 처리한다면 어떨까여?


+ Recent posts