컴

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

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건
+
제목 글쓴이 날짜 조회
12-01-22 조회 3,705
12-01-21 조회 3,057
12-01-19 조회 4,904
12-01-18 조회 2,907
12-01-18 조회 2,860
12-01-18 조회 3,055
12-01-17 조회 2,843
12-01-17 조회 3,112
12-01-14 조회 1.1만
12-01-14 조회 3,635
12-01-14 조회 3,955
12-01-11 조회 3,406
12-01-11 조회 3,136
12-01-11 조회 3,134
12-01-11 조회 3,241
12-01-11 조회 3,456
12-01-11 조회 2,777
12-01-10 조회 3,086
12-01-10 조회 2,888
12-01-10 조회 2,924
12-01-09 조회 2,906
12-01-08 조회 2,997
12-01-07 조회 2,982
12-01-06 조회 2,723
12-01-06 조회 2,841
12-01-05 조회 2,838
12-01-02 조회 2,987
11-12-29 조회 2,978
11-12-28 조회 2,949
11-12-28 조회 2,857
11-12-27 조회 3,074
11-12-23 조회 2,820
11-12-23 조회 2,947
11-12-21 조회 3,945
11-12-21 조회 2,975
11-12-19 조회 2,913
11-12-14 조회 4,332
11-12-08 조회 3,479
11-12-08 조회 4,110
11-12-07 조회 4,390
11-12-06 조회 4,292
11-12-06 조회 3,683
11-12-05 조회 3,320
11-12-05 조회 4,922
11-12-04 조회 3,312
11-12-03 조회 3,623
11-12-02 조회 3,553
11-12-02 조회 3,537
11-12-02 조회 2,872
11-12-01 조회 2,861
11-12-01 조회 3,743
11-12-01 조회 2,828
11-11-29 조회 5,701
11-11-23 조회 3,636
11-11-23 조회 3,978
11-11-22 조회 3,968
11-11-22 조회 3,022
11-11-21 조회 3,556
11-11-21 조회 2,859
11-11-18 조회 3,964
11-11-18 조회 3,097
11-11-17 조회 2,982
11-11-17 조회 2,994
11-11-17 조회 4,576
11-11-11 조회 2,850
11-11-11 조회 2,847
11-11-11 조회 3,974
11-11-11 조회 4,681
11-11-08 조회 2,977
11-11-06 조회 3,427
11-11-06 조회 3,728
11-10-21 조회 2,528
11-10-21 조회 2,446
11-10-19 조회 2,510
11-10-19 조회 4,022
11-10-08 조회 2,548
11-10-06 조회 4,241
11-10-01 조회 2,641
11-09-30 조회 2,617
11-09-29 조회 2,604
11-09-26 조회 2,472
11-09-23 조회 2,485
11-09-23 조회 2,229
11-09-22 조회 2,803
11-09-09 조회 3,122
11-08-30 조회 4,199
11-08-23 조회 2,237
11-08-12 조회 2,436
11-08-04 조회 4,000
11-07-01 조회 2,981
11-06-09 조회 2,616
11-05-17 조회 2,741
11-05-07 조회 2,994
11-04-21 조회 2,683
11-04-12 조회 2,543
11-04-11 조회 3,627
11-02-11 조회 2,743
11-02-08 조회 2,220
11-01-11 조회 2,593
10-11-26 조회 3,917