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

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

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
14년 전 조회 1,240
14년 전 조회 1,520
14년 전 조회 1,418
14년 전 조회 848
14년 전 조회 918
14년 전 조회 686
14년 전 조회 859
14년 전 조회 1,617
14년 전 조회 2,365
14년 전 조회 2,259
14년 전 조회 1,896
14년 전 조회 1,435
14년 전 조회 1,516
14년 전 조회 1,294
14년 전 조회 1,554
14년 전 조회 660
14년 전 조회 1,285
14년 전 조회 659
14년 전 조회 1,104
14년 전 조회 876
14년 전 조회 1,988
14년 전 조회 759
14년 전 조회 2,578
14년 전 조회 998
14년 전 조회 836
14년 전 조회 2,931
14년 전 조회 705
14년 전 조회 983
14년 전 조회 518
14년 전 조회 835
14년 전 조회 619
14년 전 조회 1,312
14년 전 조회 743
14년 전 조회 1,117
14년 전 조회 740
14년 전 조회 667
14년 전 조회 647
14년 전 조회 1,354
14년 전 조회 821
14년 전 조회 703
14년 전 조회 728
14년 전 조회 1,394
14년 전 조회 1,406
14년 전 조회 603
14년 전 조회 2,482
14년 전 조회 479
14년 전 조회 752
14년 전 조회 3,210
14년 전 조회 681
14년 전 조회 1,111
14년 전 조회 1,468
14년 전 조회 584
14년 전 조회 786
14년 전 조회 844
14년 전 조회 1,205
14년 전 조회 817
14년 전 조회 1,106
14년 전 조회 3,048
14년 전 조회 1,420
14년 전 조회 807
14년 전 조회 1,605
14년 전 조회 972
14년 전 조회 507
14년 전 조회 2,396
14년 전 조회 791
14년 전 조회 851
14년 전 조회 1,157
14년 전 조회 1,029
14년 전 조회 1,067
14년 전 조회 598
14년 전 조회 2,474
14년 전 조회 887
14년 전 조회 1,510
14년 전 조회 1,183
14년 전 조회 1,188
14년 전 조회 891
14년 전 조회 1,189
14년 전 조회 755
14년 전 조회 782
14년 전 조회 1,607
14년 전 조회 1,361
14년 전 조회 1,174
14년 전 조회 1,216
14년 전 조회 1,944
14년 전 조회 1,525
14년 전 조회 631
14년 전 조회 1,514
14년 전 조회 1,292
14년 전 조회 1,374
14년 전 조회 852
14년 전 조회 890
14년 전 조회 848
14년 전 조회 833
14년 전 조회 1,455
14년 전 조회 792
14년 전 조회 1,091
14년 전 조회 1,365
14년 전 조회 1,423
14년 전 조회 1,101
14년 전 조회 1,872
🐛 버그신고