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 28047 게시물 읽기
No. 28047
남은부분 범위 뽑아오는 쿼리.
작성자
이상
작성일
2009-02-19 21:03ⓒ
2009-02-19 21:52ⓜ
조회수
5,722

테이블에 데이타가 순차적으로 들어갑니다.
table1
a  b
1  1
2  1
3  1
4  0
5  0
6  1
7  1
8  0
9  0
10  0
11  1
.
.
.
100  0

table1에 데이타가 위와 같이 들어있다면 a 는 순차적으로 증가하는 값이구요..
b는 1,0 으로 사용여부의 플래그 입니다. 1: 사용 , 0: 미사용

뽑고싶은 결과는

4 ~ 5
8 ~ 10
같이 지금 사용되지 않은 범위를 구하고 싶습니다.
쿼리로 가능할까요?


아래 구헌수님이 좋은 쿼리를 알려 주셨습니다.
그런데 레코드 수가 전체 40만개에다가 조건에 맞는게 7만개가 넘으니 응답없이 게속 도네요.. 1분정도 지나서 결국 Kill....
select concat(min(a), ' ~ ' , max(a)) as rslt_valu
  from (
        select a, (select sum(b) from table1 ia where ia.a <= a.a) as sum_valu
          from table1 a
         where a.b = 0
       ) x
 group by x.sum_valu;

구헌수(madcat)님이 2009-02-18 13:02:02에 작성한 댓글입니다
이 글에 대한 댓글이 총 3건 있습니다.
조회할 데이터가 많을 때, 속도와 관련해서 처음 쿼리는 문제가 있는게 사실입니다.
그렇다고 딱히 이거다라고 내세울 만한 대체물을 내놓기도 쉽지 않네요-_-a

크게 속도향상을 기대하기는 어렵겠지만 일단...아래와 같이 해보시는 것은 어떨지...
단, 제약이 있는데...데이터 액세스가 table1의 a컬럼의 오름차순으로 되어야 성립됩니다.

select concat(min(a), ' ~ ' , max(a)) as rslt_valu
  from (
        select a, b, @val := @val + b as valu
          from table1 a, (select @val := 0) b
       ) x
 where x.b = 0
 group by valu
 limit 0, 10;

다른 의견 있으신 분들 계신가요?
구헌수(madcat)님이 2009-02-20 18:33에 작성한 댓글입니다.

좀 다르긴 한데, 더 빠를진 모르겠습니다. 구헌수님 댓글 보고 정말 많이 배웁니다. ( 감사합니다 ^^ )

select concat(min(a), ' ~ ' , max(a)) as rslt_valu from

(

select a, IF( @prev+1 = a, @k, @k:= @k + 1 ) as k, @prev := a from

(select a from table1 where b = 0) x,

(select @prev:=0, @k:=0) y

) z

group by k;

 

수정 ) 참, 위의 쿼리는 일단 b컬럼의 값이 0이 적은 경우에 유용한 것 같습니다. 안 쓴 블럭이 더 적게 있다는 전제하에 만들어 본 쿼리입니다.

추가 ) 제 노트북의 튜닝 안된 DB에서 벌크 데이터 10만개 정도로 셋팅하고 해보니 2-3초, 20만개에 5초 정도에 나오는데, 40만개 넣으니 1분 넘게 죽어나네요. 튜닝이 좀 필요한 쿼리인 듯 합니다 -.-

 

 

박현우(lqez)님이 2009-02-21 13:48에 작성한 댓글입니다.
이 댓글은 2009-02-21 14:14에 마지막으로 수정되었습니다.

아~ 좋은 쿼리들 감사합니다.


저두 변수로 대체해서 짜보려고 했는데.. 머리가 나빠서 안돼더라구요...ㅋㅋㅋ


테스트는 못해봤는데.. 성능은 훨씬더 좋을것 같네요.


구현수님 말대로 처음 돌릴때 많이 걸리네요.. 다음에는 캐시에서 가져오니 성능은 좋킨한데.


이게 하루에 한,두번 쓸정도의 부분이라 좀 문제네요. 그리고 갯수가 수십만개씩 게속해서 늘어나는거라..


그래서 일정부분 프로그램로직으로 해결했습니다.


일단 남은 부분을 계산하지 않코 할당된부분의 min, max값을 구하고 min-1, max+1을 해서 사용된 영역을 구해서 프로그램으로 처리했습니다. 역발상도 좋은방법이라 생각합니다. 


로직을 쓰는걸 안좋아하는데 어쩔수 없네요... ㅠㅠ;


구헌수님 쿼리보며 좀 찾아보니 MySQL에서 Rank 에뮬레이팅 하는거랑 비슷한 쿼리네요. 로직도 비슷한듯하고...


두분 쿼리보며 공부좀 더해야 겠습니다. 쿼리로 불가능 한건 없다.......


감사합니다.

이상님이 2009-02-24 13:57에 작성한 댓글입니다.
이 댓글은 2009-02-24 14:01에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
28050프로시저를 이용해서 BLOB 데이터 반환해보신 분 계신가요?
SNICKERS
2009-02-23
4914
28049mysql 접속 에러 도움 요청합니다. [2]
정화용
2009-02-23
5126
28048대용량 서비스에서 Falcon 엔진 사용하시는 분 계시나요? [1]
김승동
2009-02-20
5816
28047남은부분 범위 뽑아오는 쿼리. [3]
이상
2009-02-19
5722
28046우욱님 조인 질문 하나만 더드릴께요 [1]
박균
2009-02-19
5332
28045mysql status 질문 [1]
김성환
2009-02-19
5118
28044mysql: unknown variable 'default-collation=euckr_korean_ci'이렇게나옴 어떻게해야되나요? [2]
이성훈
2009-02-19
6994
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다