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
운영게시판
최근게시물
MySQL Q&A 29197 게시물 읽기
No. 29197
상위 %를 구하는 쿼리인데요. 속도가 나질 않습니다.
작성자
투더리
작성일
2009-07-23 16:27ⓒ
2009-07-23 17:06ⓜ
조회수
6,420

전체 데이터는 약 53만건 정도되고, 각 값들이 상위 몇 %에 해당하는 지 구해 서 DB에 넣으려고 합니다...


예를 들어 다음과 같습니다. 아래의 계산식으로 %까지 구해서 넣고자 합니다.

갯수는 동점자 숫자입니다.

아래처럼 계산하기 위해서 먼저 각각의 갯수를 구한 뒤 다시 이전 등수까지의 합계를 구합니다.

이전 등수까지 합계 구하는 부분이 문제가 되고 있습니다.


등수 | 갯수 | 합계 |  상위 %

-----------------------------------

1    |   1  |  1   | (1/15) * 100

2    |   2  |  3   | (3/15) * 100

3    |   7  | 10   | (10/15) * 100

4    |   3  | 13   | (13/15) * 100

5    |   2  | 15   | (15/15) * 100

합계     15


문제는 속도입니다. 16만건 인서트를 테스트하기 위해 sqlYog에서 실행 하는데도 끝나질 않습니다.


db스키마입니다.

TempRankCal과 TempTB는 동일 구조입니다.

>>>

create table TempTB

(

       Standard     float default 0,

       Rank         float default 0,

       SumCount     float default 0

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

create index IDX_ST on TempTB(Standard);

-> 원래 double 타입이었다가 혹시나 해서 float로 바꿨습니다.


저장 쿼리입니다.

>>>

insert into TempRankCal

select 

       B.Rank, B.Standard, sum(A.SumCount) as total

from

       TempTB A, TempTB B

where

       A.Rank <= B.Rank and

group by B.Rank



쿼리는 간단한데 왜 저렇게 속도가 안 나는 걸까요...

고수님들 좀 도와 주세요.

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

mysql> desc t;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| rank | int(11) | YES | | NULL | |

| cnt | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

2 rows in set (0.00 sec)

 

mysql> select * from t;

+------+------+

| rank | cnt |

+------+------+

| 1 | 1 |

| 2 | 2 |

| 3 | 7 |

| 4 | 3 |

| 5 | 2 |

+------+------+

5 rows in set (0.00 sec)

 

mysql> select rank,cnt,@sum:=@sum+cnt from t, (select @sum:=0) x order by rank;

+------+------+----------------+

| rank | cnt | @sum:=@sum+cnt |

+------+------+----------------+

| 1 | 1 | 1 |

| 2 | 2 | 3 |

| 3 | 7 | 10 |

| 4 | 3 | 13 |

| 5 | 2 | 15 |

+------+------+----------------+

5 rows in set (0.00 sec)

 

mysql> select rank,cnt,@sum:=@sum+cnt,@sum/total*100 from t, (select @sum:=0) x, (select sum(cnt) as total from t ) y order by rank;

+------+------+----------------+----------------+

| rank | cnt | @sum:=@sum+cnt | @sum/total*100 |

+------+------+----------------+----------------+

| 1 | 1 | 1 | 6.6667 |

| 2 | 2 | 3 | 20.0000 |

| 3 | 7 | 10 | 66.6667 |

| 4 | 3 | 13 | 86.6667 |

| 5 | 2 | 15 | 100.0000 |

+------+------+----------------+----------------+

5 rows in set (0.00 sec)

 

mysql>

 

 

변수 써서 하시는게 낫지 않을까요? rank에 인덱스만 있으면 속도는 나쁘지 않을 것 같습니다.

그리고 각 변수는 float일 필요가 없을 것 같습니다. 정수형이 아닌 등수나 개수는 존재하지 않으니깐요.

 

 

박현우(lqez)님이 2009-07-24 14:09에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29200mysql 설치 에러 문의
오태욱
2009-07-25
6858
29199테이블 생성시 에러... [1]
궁금
2009-07-24
15333
29198자동증가하는 칼럼에 대해서 질문있습니다. [2]
deck
2009-07-24
5812
29197상위 %를 구하는 쿼리인데요. 속도가 나질 않습니다. [1]
투더리
2009-07-23
6420
29196SQL문을 어떻게 해야 하나요? (조인으로 가능한가요) [1]
홍길동
2009-07-23
5486
29195InnoDB를 사용하려면 어떤 설정을 해야 하나요? [1]
김지숙
2009-07-22
7319
29194중국어 문자셋 포함 select [2]
박성원
2009-07-22
5933
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다