쿼리문이 속도가 느리네요. 묘안이 있을까요? > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

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

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

본문

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을 조인하여 같은 코드의 수량을 합산하여 원하는 필드값을 출력하는 퀴리문입니다.
레코드가 늘어나니 속도가 엄청 느려지네요.
위의 쿼리문은 불필요한 필드를 제외하고 수정한 것입니다.
쿼리 고수님들 한번 검토해 주세요.

댓글 전체

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

제가 보기에는...

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

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

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

1. in_code, pr_code 인덱스 체크
2. 서브쿼리 b의 group by 쿼리를 distinct 쿼리로 수정
3. 서브쿼리 a의 group by 쿼리는 단순 where 조건절로 수정 또는 밖으로 빼서 바로 조인
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
인덱스 구성도 정말 신중하게 해줘야한다는것을 이번에 실감하네요.

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초가 넘네요.
쩝쩝...쿼리문을 손봐야하겠는데...
어떻게 손을 봐야 빨라질지..난감합니다.ㅠㅠ
전체 135,051
십년전오늘 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT