쿼리문이 속도가 느리네요. 묘안이 있을까요?
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개
똥싼너구리
14년 전
쿼리 고수는 아니지만..
흥미로운 쿼리문이라 살펴 보았습니다.^^
제가 보기에는...
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
이것또한 비슷하긴 하지만.. 카운트 하는것이 있어서 그룹으로 묶어야 겠네요..
이 안의 서브쿼리는 밖으로 빼는게 속도가 더 느리게 나오나요?
한번도 해보지 않아서 잘 모르겠네요..
인덱스는 당연히 적절히 잘 설정하셨을거라 생각합니다.
데이터셋이 있으면 한번 테스트 해볼텐데..
하쉽네요..^^
흥미로운 쿼리문이라 살펴 보았습니다.^^
제가 보기에는...
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
이것또한 비슷하긴 하지만.. 카운트 하는것이 있어서 그룹으로 묶어야 겠네요..
이 안의 서브쿼리는 밖으로 빼는게 속도가 더 느리게 나오나요?
한번도 해보지 않아서 잘 모르겠네요..
인덱스는 당연히 적절히 잘 설정하셨을거라 생각합니다.
데이터셋이 있으면 한번 테스트 해볼텐데..
하쉽네요..^^
14년 전
댓글 감사합니다. 음~ 결과가 같게 나온다면 정말 좋겠네요. 속도가 빨라진다니 말입니다.
한번 테스트해보고 후기 올리겠습니다. 행복한 밤 되세요.^^
한번 테스트해보고 후기 올리겠습니다. 행복한 밤 되세요.^^
14년 전
outer join 에 subjquery는 좋지 않은 성능을 내더라구요. 제가 잘못한건지, index를 전혀 못쓰니까,, 성능이 들죽날죽..
똥싼너구리
14년 전
이런 성능에 대한 책이 있으면 참 좋겠습니다.ㅠㅠ
대용량 데이터베이스를 만져볼 기회가 잘 없으니..
이런 경험도 귀중한 경험이 될것 같습니다.
대용량 데이터베이스를 만져볼 기회가 잘 없으니..
이런 경험도 귀중한 경험이 될것 같습니다.
14년 전
저도 그냥 초보 입장에서 체크해보았습니다^^;; 체크 우선순으로 ~
1. in_code, pr_code 인덱스 체크
2. 서브쿼리 b의 group by 쿼리를 distinct 쿼리로 수정
3. 서브쿼리 a의 group by 쿼리는 단순 where 조건절로 수정 또는 밖으로 빼서 바로 조인
1. in_code, pr_code 인덱스 체크
2. 서브쿼리 b의 group by 쿼리를 distinct 쿼리로 수정
3. 서브쿼리 a의 group by 쿼리는 단순 where 조건절로 수정 또는 밖으로 빼서 바로 조인
똥싼너구리
14년 전
오 distinct로 수정하는 생각도 좋은 생각이네요
감사합니다.
감사합니다.
14년 전
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
검증이 안된거라..^^; 틀리면 죄송합니다.
from
in_table a
where a.in_code='123'
order by a.in_pumno
저도 초보입장으로 보면.. 두번의 서브쿼리를 풀스캔을 하고 있어서 데이타 양에 따라 상당히 부하가 가지 않을까 싶네요.
순도뤼님 말씀처럼 적절한 인덱스 걸기가 중요할거 같네요.
1. 비교부분에 인덱스 부분, in_pumno,in_code,pr_code
검증이 안된거라..^^; 틀리면 죄송합니다.
14년 전
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
그런데 속도는 첫번째 쿼리가 두번째 쿼리보다 엄청빠릅니다.
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
똥싼너구리
14년 전
비교분석 감사드립니다.
역시 WHERE가 빠르군요..^^
역시 WHERE가 빠르군요..^^
14년 전
인덱스 구성도 정말 신중하게 해줘야한다는것을 이번에 실감하네요.
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
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
똥싼너구리
14년 전
http://blog.wowpc.net/30
아직 explain을 분석할줄 몰라 잠시 찾아 보았습니다.
첫번째 두번째 로 분석된 테이블은 인덱스를 활용하지 못했군요..
아직 explain을 분석할줄 몰라 잠시 찾아 보았습니다.
첫번째 두번째 로 분석된 테이블은 인덱스를 활용하지 못했군요..
14년 전
어떻게 해야 할까요? ㅠㅠ
레코드수가 많은 놈은 속도가 40초가 넘네요.
쩝쩝...쿼리문을 손봐야하겠는데...
어떻게 손을 봐야 빨라질지..난감합니다.ㅠㅠ
레코드수가 많은 놈은 속도가 40초가 넘네요.
쩝쩝...쿼리문을 손봐야하겠는데...
어떻게 손을 봐야 빨라질지..난감합니다.ㅠㅠ
어웨이크닝
13년 전
음..
게시글 목록
| 번호 | 제목 |
|---|---|
| 2372 | |
| 25946 | |
| 14575 |
jQuery
jquery 질문하나만 부탁드립니다.
5
|
| 2367 | |
| 29773 | |
| 2358 | |
| 2354 | |
| 2350 | |
| 29770 | |
| 29766 |
HTML
자바스크립트 정규식 질문 드립니다
3
|
| 24173 | |
| 2345 | |
| 25942 | |
| 25939 | |
| 29764 | |
| 14571 |
jQuery
jQuery 샘플자료들이 많군요
3
|
| 14567 | |
| 14561 |
JavaScript
css관련 질문입니다!
5
|
| 24172 | |
| 29763 | |
| 14556 |
JavaScript
관계연산자?
4
|
| 14550 |
JavaScript
select 를 스크립트 질문이요.
5
|
| 14549 | |
| 2332 | |
| 14544 | |
| 14535 |
JavaScript
php함수에 setTimeout 비스꾸무리한게 있나요?
8
|
| 14534 | |
| 14529 | |
| 2318 | |
| 2313 | |
| 2311 | |
| 14526 |
JavaScript
제로보드&그누보드 구별법
2
|
| 14522 | |
| 29761 | |
| 25938 | |
| 29759 |
HTML
소스가 안되서 질문을 좀 드려요
1
|
| 2297 | |
| 2281 | |
| 25936 | |
| 14521 | |
| 14514 |
MySQL
트렌젝션 문의
6
|
| 24167 | |
| 25935 | |
| 2266 | |
| 14513 |
JavaScript
특정사용자 소유의 모든파일 찾기
|
| 14512 | |
| 2257 | |
| 2230 | |
| 14511 | |
| 25926 |
계약서
유지보수 계약서
8
|
| 14503 | |
| 2224 | |
| 25922 | |
| 25920 | |
| 2211 | |
| 14500 | |
| 2209 | |
| 14499 | |
| 24158 | |
| 2204 | |
| 14491 | |
| 2197 | |
| 14490 |
jQuery
Jquery + me2day 검색
|
| 14489 |
jQuery
Jquery + me2day 검색
|
| 2189 | |
| 24155 | |
| 14487 |
MySQL
mysql 데이터 파일 체크하기
1
|
| 14486 | |
| 25916 | |
| 2185 | |
| 29757 |
HTML
제이쿼리 부문 질문입니다.
1
|
| 24154 | |
| 25913 | |
| 29755 | |
| 14484 | |
| 2181 | |
| 2164 | |
| 25907 | |
| 2163 | |
| 2153 | |
| 2149 | |
| 2145 | |
| 2130 | |
| 2116 | |
| 2107 | |
| 2103 | |
| 29753 | |
| 14483 |
JavaScript
view.skin.php 파일 하나 만들어 주시면 안될까요?
|
| 2099 | |
| 2039 | |
| 29750 | |
| 2021 | |
| 2015 | |
| 2006 | |
| 14482 | |
| 1989 | |
| 1972 | |
| 1969 | |
| 14481 | |
| 1963 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기