컴

쿼리문이 속도가 느리네요. 묘안이 있을까요?

select a.in_pumno, a.in_code, b.pr_amt from (select in_pumno, in_code from in_table group by in_code having in_code = "123") a left join (select pr_pumno, pr_code, sum(pr_amount) as pr_amt from pr_table group by pr_code having pr_code = "123") b on a.in_code = b.pr_code order by a.in_pumno
 
in_table과 pr_table을 조인하여 같은 코드의 수량을 합산하여 원하는 필드값을 출력하는 퀴리문입니다.
레코드가 늘어나니 속도가 엄청 느려지네요.
위의 쿼리문은 불필요한 필드를 제외하고 수정한 것입니다.
쿼리 고수님들 한번 검토해 주세요.
|

댓글 13개

쿼리 고수는 아니지만..
흥미로운 쿼리문이라 살펴 보았습니다.^^

제가 보기에는...

from (select in_pumno, in_code from in_table group by in_code having in_code = "123") a
이 구문은.. 저 select의 결과물이 in_code=123 이것중에 하나만 뽑아지겠네요..
[ WHERE a.in_code='123' order by a.in_code LIMIT 1 ]과 동일한 결과가 나올것 같습니다.
group by보다는 where가 속도가 좀더 빠르지 않을까 생각이 듭니다.

다음줄의
left join (select pr_pumno, pr_code, sum(pr_amount) as pr_amt from pr_table group by pr_code having pr_code = "123") b on a.in_code = b.pr_code

이것또한 비슷하긴 하지만.. 카운트 하는것이 있어서 그룹으로 묶어야 겠네요..
이 안의 서브쿼리는 밖으로 빼는게 속도가 더 느리게 나오나요?
한번도 해보지 않아서 잘 모르겠네요..
인덱스는 당연히 적절히 잘 설정하셨을거라 생각합니다.

데이터셋이 있으면 한번 테스트 해볼텐데..
하쉽네요..^^
댓글 감사합니다. 음~ 결과가 같게 나온다면 정말 좋겠네요. 속도가 빨라진다니 말입니다.
한번 테스트해보고 후기 올리겠습니다. 행복한 밤 되세요.^^
outer join 에 subjquery는 좋지 않은 성능을 내더라구요. 제가 잘못한건지, index를 전혀 못쓰니까,, 성능이 들죽날죽..
이런 성능에 대한 책이 있으면 참 좋겠습니다.ㅠㅠ
대용량 데이터베이스를 만져볼 기회가 잘 없으니..
이런 경험도 귀중한 경험이 될것 같습니다.
저도 그냥 초보 입장에서 체크해보았습니다^^;; 체크 우선순으로 ~

1. in_code, pr_code 인덱스 체크
2. 서브쿼리 b의 group by 쿼리를 distinct 쿼리로 수정
3. 서브쿼리 a의 group by 쿼리는 단순 where 조건절로 수정 또는 밖으로 빼서 바로 조인
오 distinct로 수정하는 생각도 좋은 생각이네요
감사합니다.
select a.in_pumno,a.in_code,(select sum(pr_amount) from pr_table where pr_code=a.in_code) as pr_amt
from
in_table a
where a.in_code='123'
order by a.in_pumno

저도 초보입장으로 보면.. 두번의 서브쿼리를 풀스캔을 하고 있어서 데이타 양에 따라 상당히 부하가 가지 않을까 싶네요.

순도뤼님 말씀처럼 적절한 인덱스 걸기가 중요할거 같네요.

1. 비교부분에 인덱스 부분, in_pumno,in_code,pr_code

검증이 안된거라..^^; 틀리면 죄송합니다.
2개의 쿼리문은 동일한 결과를 가져옵니다.
그런데 속도는 첫번째 쿼리가 두번째 쿼리보다 엄청빠릅니다.
having 절을 아무데나 쓰는게 아니군요...ㅋ
을 왜 사용하는지 모르겠군요.
HAVING SUM(필드) > 1000 이렇게 함수결과값을 얻어 비교할때만 빠르군요.
일반 조건절은 무조건 where문을 사용하십시오.

SELECT a.in_pumno, a.in_code, a.in_dcno, ifnull( a.in_amt, 0 ) , ifnull( b.pr_amt, 0 ) , ifnull( a.in_amt, 0 ) - ifnull( b.pr_amt, 0 ) , a.in_vendor
FROM (

SELECT in_pumno, in_code, in_dcno, sum( in_amount ) AS in_amt, in_vendor, in_comp
FROM in_table where in_code = '3SILKR001FJNBQ' group by in_code
) as a
LEFT JOIN (

SELECT pr_code, pr_pumno, pr_vendor, sum( pr_amount ) AS pr_amt
FROM pr_table
where pr_code = '3SILKR001FJNBQ' group by pr_code
) as b ON a.in_code = b.pr_code
ORDER BY a.in_pumno
LIMIT 0 , 30

===============================================================================

SELECT a.in_pumno, a.in_code, a.in_dcno, ifnull( a.in_amt, 0 ) , ifnull( b.pr_amt, 0 ) , ifnull( a.in_amt, 0 ) - ifnull( b.pr_amt, 0 ) , a.in_vendor
FROM (

SELECT in_pumno, in_code, in_dcno, sum( in_amount ) AS in_amt, in_vendor, in_comp
FROM in_table
GROUP BY in_code
HAVING in_code = '3SILKR001FY5HM'
)a
LEFT JOIN (

SELECT pr_code, pr_pumno, pr_vendor, sum( pr_amount ) AS pr_amt
FROM pr_table
GROUP BY pr_code
HAVING pr_code = '3SILKR001FY5HM'
)b ON a.in_code = b.pr_code
ORDER BY a.in_pumno
LIMIT 0 , 30
비교분석 감사드립니다.
역시 WHERE가 빠르군요..^^
인덱스 구성도 정말 신중하게 해줘야한다는것을 이번에 실감하네요.

EXPLAIN SELECT a.in_pumno, a.in_code, a.in_dcno, ifnull( a.in_amt, 0 ) , ifnull( b.pr_amt, 0 ) , ifnull( a.in_amt, 0 ) - ifnull( b.pr_amt, 0 ) , a.in_vendor
FROM (

SELECT in_pumno, in_code, in_dcno, sum( in_amount ) AS in_amt, in_vendor, in_comp
FROM in_table
WHERE in_code = '3SILKR001FJNBQ'
GROUP BY in_code) AS a
LEFT JOIN (

SELECT pr_code, pr_pumno, pr_vendor, sum( pr_amount ) AS pr_amt
FROM pr_table
WHERE pr_code = '3SILKR001FJNBQ'
GROUP BY pr_code) AS b ON a.in_code = b.pr_code
ORDER BY a.in_pumno
LIMIT 0 , 30

=====================================================
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
1 PRIMARY <derived3> system NULL NULL NULL NULL 1
3 DERIVED pr_table ref pr_code pr_code 50 1 Using where
2 DERIVED in_table ref in_code in_code 50 1 Using where
http://blog.wowpc.net/30

아직 explain을 분석할줄 몰라 잠시 찾아 보았습니다.

첫번째 두번째 로 분석된 테이블은 인덱스를 활용하지 못했군요..
어떻게 해야 할까요? ㅠㅠ
레코드수가 많은 놈은 속도가 40초가 넘네요.
쩝쩝...쿼리문을 손봐야하겠는데...
어떻게 손을 봐야 빨라질지..난감합니다.ㅠㅠ
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
11-08-06 조회 2,858
11-08-06 조회 2,537
11-08-06 조회 3,248
11-08-05 조회 2,905
11-08-05 조회 2,776
11-08-05 조회 3,120
11-08-05 조회 3,053
11-08-05 조회 2,533
11-08-05 조회 2,469
11-08-05 조회 2,259
11-08-05 조회 2,473
11-08-05 조회 3,309
11-08-05 조회 3,926
11-08-04 조회 3,973
11-08-04 조회 3,497
11-08-04 조회 3,001
11-08-04 조회 3,013
11-08-04 조회 2,872
11-08-04 조회 3,124
11-08-04 조회 2,122
11-08-04 조회 2,993
11-08-04 조회 2,138
11-08-04 조회 2,626
11-08-04 조회 2,408
11-08-04 조회 3,606
11-08-03 조회 2,308
11-08-03 조회 4,120
11-08-03 조회 2,657
11-08-03 조회 2,449
11-08-03 조회 4,532
11-08-03 조회 2,172
11-08-03 조회 2,531
11-08-03 조회 1,978
11-08-02 조회 2,486
11-08-02 조회 2,080
11-08-02 조회 2,834
11-08-02 조회 2,187
11-08-02 조회 2,698
11-08-02 조회 2,243
11-08-02 조회 2,164
11-08-01 조회 2,088
11-08-01 조회 2,992
11-08-01 조회 2,314
11-08-01 조회 2,173
11-08-01 조회 2,178
11-07-30 조회 2,918
11-07-30 조회 2,883
11-07-29 조회 2,069
11-07-29 조회 4,021
11-07-28 조회 1,960
11-07-28 조회 2,186
11-07-28 조회 4,779
11-07-27 조회 2,223
11-07-27 조회 2,657
11-07-27 조회 2,953
11-07-26 조회 2,093
11-07-26 조회 2,203
11-07-26 조회 2,257
11-07-26 조회 2,618
11-07-26 조회 2,202
11-07-26 조회 2,504
11-07-26 조회 4,453
11-07-26 조회 2,838
11-07-26 조회 2,260
11-07-26 조회 3,069
11-07-25 조회 2,359
11-07-25 조회 1,945
11-07-25 조회 3,836
11-07-25 조회 2,229
11-07-25 조회 2,336
11-07-23 조회 2,559
11-07-23 조회 2,499
11-07-23 조회 2,647
11-07-22 조회 2,056
11-07-22 조회 3,986
11-07-22 조회 2,330
11-07-21 조회 2,985
11-07-21 조회 2,522
11-07-21 조회 2,635
11-07-21 조회 2,286
11-07-20 조회 2,527
11-07-20 조회 2,108
11-07-20 조회 2,159
11-07-20 조회 2,917
11-07-20 조회 2,742
11-07-20 조회 2,521
11-07-20 조회 2,589
11-07-20 조회 3,492
11-07-20 조회 3,175
11-07-19 조회 2,107
11-07-19 조회 2,937
11-07-19 조회 2,812
11-07-19 조회 2,814
11-07-18 조회 2,344
11-07-18 조회 2,326
11-07-18 조회 2,304
11-07-18 조회 2,298
11-07-18 조회 2,976
11-07-18 조회 2,337
11-07-17 조회 2,564