테스트 사이트 - 개발 중인 베타 버전입니다

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

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초가 넘네요.
쩝쩝...쿼리문을 손봐야하겠는데...
어떻게 손을 봐야 빨라질지..난감합니다.ㅠㅠ

게시글 목록

번호 제목
1959
14479
14475
14474
14469
14466
29747
14464
14463
1950
1943
1938
14460
29743
14453
29738
1936
24146
25894
1923
1919
1916
1913
24135
24131
25885
14449
1895
1891
1886
14443
1875
25884
14442
1872
29735
14441
1861
14438
14434
1836
29734
29727
14430
14426
정규표현식 왜 서버는... 3
14425
1828
1813
29725
29719
1808
1804
14423
24120
25866
14420
25863
1784
1777
25859
14419
1775
29717
1768
1759
1744
14416
14414
14413
1737
14412
1718
1714
1704
1700
29714
1699
14411
1696
1686
1677
1672
1671
25853
1660
1654
1650
25851
25850
1647
1588
1586
1580
1567
14408
1553
24109
1551
25849
25848