랭킹관련 질답란을 찾아보았지만 원하는 내용이 없어 질문드립니다
CREATE TABLE RankData
{
[Idx] [int] NOT NULL,
[Name] [nchar] NOT NULL,
[Tech] [int] NOT NULL,
[Exp] [int] NOT NULL,
CONSTRAINT [PK_RankData_1] PRIMARY KEY CLUESTERED
(
[Idx] ASC
) ON [PRIMARY]
}
위와 같은 데이타가 10만건이 있을때
(Tech*2 + Exp) 값을 가지고 위 데이타의 랭킹을 매기고자 합니다
제가 생각한 경우는 디비에서 직접 값을 구하는 것은 무리가 있을것 같아
디비의 모든 데이타를 프로그램으로 읽어
디비가 아닌 프로그램으로 메모리 상에서 랭킹을 매기고
Rank라는 컬럼을 추가하거나 별도의 테이블 (Idx와 Rank 정보)에 저장을 할까 합니다
근데 이것보다 더 나은 방법이 있는지 이러한 과정을 구현할 때 염두에 두어야할 부분이 궁금합니다
감사합니다
Comment 5
-
나는짱이야
2014.09.03 13:53
-
삼류가수
2014.09.03 14:12
RankData에서 특정 idx 의 값을 가져올 때마다 rank 함수를 돌리면 성능이 매우 나빠질것 같은데 고수님들의 의견 부탁드립니다
실시간 rank는 아니어도 되지만 가능한한 최신 rank 정보를 가져오고 싶습니다
-
군고구마
2014.09.03 14:34
제 경험상으로는 랭킹 점수컬럼을 따로 만든 뒤에 거기서 환산한 뒤에 그것을 프로그램딴에 가져와서(desc로) 박고 보여줬습니다.
실시간으로는 생각을 안해본게 계속 select하고 desc하면 비용이 만만치 않기 때문에, 아니면 차라리 테이블을 2개를 만들어서 집계하는 테이블과 보여주기용 테이블을 만든 다음에 몇시간에 한번씩 집계해서 보여주기 테이블에 넣고 그 보여주기 테이블을 조회하도록 하는건 어떨까 하네요.
보여주기 테이블에 넣을 때는 desc로 넣어서 (점수순으로) 한다면, 부를때마다 정렬하거나 집계 안하므로 부하를 최소화 할 수 있다고 생각이 듭니다만...
저희는 그 부하를 생각해서 새벽시간에 1번만 집계하고 하루동안 그 테이블을 이용했습니다.
-
항해자™
2014.09.03 16:11
실시간이면 레디스 한번 써보심이,,, -
이스트럭(강동운)
2014.09.04 14:48
안녕하세요. 레디스 사용하실거라면.. 아래 링크 한번 읽어보시기 바랍니다.
레디스 관련해서 정리를 잘해두셨네요~~
만약 레디스를 사용하신다면.. sorted sets을 활용해보시기 바랍니다.
rank함수가 있는걸로 알고 있습니다.