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

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초가 넘네요.
쩝쩝...쿼리문을 손봐야하겠는데...
어떻게 손을 봐야 빨라질지..난감합니다.ㅠㅠ
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

+
제목 글쓴이 날짜 조회
14년 전 조회 1,304
14년 전 조회 1,575
14년 전 조회 1,479
14년 전 조회 911
14년 전 조회 977
14년 전 조회 747
14년 전 조회 917
14년 전 조회 1,677
14년 전 조회 2,421
14년 전 조회 2,328
14년 전 조회 1,965
14년 전 조회 1,496
14년 전 조회 1,573
14년 전 조회 1,357
14년 전 조회 1,611
14년 전 조회 721
14년 전 조회 1,341
14년 전 조회 716
14년 전 조회 1,167
14년 전 조회 934
14년 전 조회 2,051
14년 전 조회 825
14년 전 조회 2,653
14년 전 조회 1,050
14년 전 조회 895
14년 전 조회 2,986
14년 전 조회 781
14년 전 조회 1,045
14년 전 조회 578
14년 전 조회 903
14년 전 조회 672
14년 전 조회 1,371
14년 전 조회 796
14년 전 조회 1,177
14년 전 조회 803
14년 전 조회 715
14년 전 조회 696
14년 전 조회 1,416
14년 전 조회 875
14년 전 조회 762
14년 전 조회 785
14년 전 조회 1,456
14년 전 조회 1,465
14년 전 조회 661
14년 전 조회 2,540
14년 전 조회 545
14년 전 조회 812
14년 전 조회 3,282
14년 전 조회 745
14년 전 조회 1,173
14년 전 조회 1,532
14년 전 조회 643
14년 전 조회 846
14년 전 조회 903
14년 전 조회 1,257
14년 전 조회 871
14년 전 조회 1,156
14년 전 조회 3,109
14년 전 조회 1,480
14년 전 조회 873
14년 전 조회 1,661
14년 전 조회 1,026
14년 전 조회 559
14년 전 조회 2,450
14년 전 조회 839
14년 전 조회 909
14년 전 조회 1,222
14년 전 조회 1,094
14년 전 조회 1,122
14년 전 조회 650
14년 전 조회 2,531
14년 전 조회 941
14년 전 조회 1,547
14년 전 조회 1,231
14년 전 조회 1,245
14년 전 조회 958
14년 전 조회 1,237
14년 전 조회 811
14년 전 조회 848
14년 전 조회 1,668
14년 전 조회 1,417
14년 전 조회 1,228
14년 전 조회 1,285
14년 전 조회 2,001
14년 전 조회 1,584
14년 전 조회 692
14년 전 조회 1,577
14년 전 조회 1,356
14년 전 조회 1,434
14년 전 조회 919
14년 전 조회 952
14년 전 조회 912
14년 전 조회 898
14년 전 조회 1,528
14년 전 조회 849
14년 전 조회 1,152
14년 전 조회 1,425
14년 전 조회 1,481
14년 전 조회 1,148
14년 전 조회 1,929