쿼리 속도를 개선할 방법이 없을까요?
in_table의 자료(입고자료)
in_code in_pumno in_dcno in_amt in_vendor in_comp
173-2 11105D(3/11) 2005173-2 11105D 1020 ISP 1공장
173-2 11157N(5/5) 2005173-2 11157N 357 ISP 1공장
173-2 11161D(5/10) 2005173-2 11166D 85 ISP 1공장
173-2 11165N(5/10) 2005173-2 11165N 459 ISP 1공장
173-2 11167D(5/18) 2005173-2 11167D 510 ISP 1공장
173-2 11167N(5/17) 2005173-2 11167N 510 ISP 1공장
173-2 11167N(5/18) 2005173-2 11167N 255 ISP 1공장
173-2 11167N(5/18)2 2005173-2 11167N 510 ISP 1공장
173-2 11171D(5/18) 2005173-2 11171D 255 ISP 1공장
173-2 11171N(5/18) 2005173-2 11171N 510 ISP 1공장
173-2 11172D(5/18) 2005173-2 11172D 510 ISP 1공장
173-2 11172N(5/18) 2005173-2 11172N 272 ISP 1공장
173-2 11172N(5/18)2 2005173-2 11172N 510 ISP 1공장
173-2 11173D(5/18) 2005173-2 11173D 221 ISP 1공장
173-2 11202D(5/20) 2005173-2 11202D 136 ISP 1공장
173-2 11202N(5/20) 2005173-2 11202N 408 ISP 1공장
173-2 11202N(5/20)2 2005173-2 11202N 374 ISP 1공장
173-2 11203D(5/20) 2005173-2 11203D 102 ISP 1공장
173-2 11203D(5/24) 2005173-2 11203D 136 ISP 1공장
173-2 11203D(5/24)2 2005173-2 11203D 510 ISP 1공장
173-2 11203N(5/20) 2005173-2 11203N 510 ISP 1공장
173-2 11203N(5/24) 2005173-2 11203N 374 ISP 1공장
173-2 11203N(5/24)2 2005173-2 11203N 493 ISP 1공장
173-2 11204D(5/20) 2005173-2 11204D 357 ISP 1공장
173-2 11204D(5/20)2 2005173-2 11204D 510 ISP 1공장
173-2 11204N(5/20) 2005173-2 11204N 153 ISP 1공장
173-2 11204N(5/24) 2005173-2 11204N 510 ISP 1공장
173-2 11205D(5/24) 2005173-2 11205D 17 ISP 1공장
173-2 11205N(5/24) 2005173-2 11205N 493 ISP 1공장
173-2 11212N(5/28) 2005173-2 11212N 884 ISP 1공장
173-2 11105D(3/11) 2005173-2 11105D 1020 ISP 1공장
173-2 11157N(5/5) 2005173-2 11157N 357 ISP 1공장
173-2 11161D(5/10) 2005173-2 11166D 85 ISP 1공장
173-2 11165N(5/10) 2005173-2 11165N 459 ISP 1공장
173-2 11167D(5/18) 2005173-2 11167D 510 ISP 1공장
173-2 11167N(5/17) 2005173-2 11167N 510 ISP 1공장
173-2 11167N(5/18) 2005173-2 11167N 255 ISP 1공장
173-2 11167N(5/18)2 2005173-2 11167N 510 ISP 1공장
173-2 11171D(5/18) 2005173-2 11171D 255 ISP 1공장
173-2 11171N(5/18) 2005173-2 11171N 510 ISP 1공장
173-2 11172D(5/18) 2005173-2 11172D 510 ISP 1공장
173-2 11172N(5/18) 2005173-2 11172N 272 ISP 1공장
173-2 11172N(5/18)2 2005173-2 11172N 510 ISP 1공장
173-2 11173D(5/18) 2005173-2 11173D 221 ISP 1공장
173-2 11202D(5/20) 2005173-2 11202D 136 ISP 1공장
173-2 11202N(5/20) 2005173-2 11202N 408 ISP 1공장
173-2 11202N(5/20)2 2005173-2 11202N 374 ISP 1공장
173-2 11203D(5/20) 2005173-2 11203D 102 ISP 1공장
173-2 11203D(5/24) 2005173-2 11203D 136 ISP 1공장
173-2 11203D(5/24)2 2005173-2 11203D 510 ISP 1공장
173-2 11203N(5/20) 2005173-2 11203N 510 ISP 1공장
173-2 11203N(5/24) 2005173-2 11203N 374 ISP 1공장
173-2 11203N(5/24)2 2005173-2 11203N 493 ISP 1공장
173-2 11204D(5/20) 2005173-2 11204D 357 ISP 1공장
173-2 11204D(5/20)2 2005173-2 11204D 510 ISP 1공장
173-2 11204N(5/20) 2005173-2 11204N 153 ISP 1공장
173-2 11204N(5/24) 2005173-2 11204N 510 ISP 1공장
173-2 11205D(5/24) 2005173-2 11205D 17 ISP 1공장
173-2 11205N(5/24) 2005173-2 11205N 493 ISP 1공장
173-2 11212N(5/28) 2005173-2 11212N 884 ISP 1공장
pr_table의 자료(출고자료)
pr_code pr_pumno pr_vendor pr_amt
173-2 11105D(3/11) 2005173-2 ISP 1020
173-2 11157N(5/5) 2005173-2 ISP 357
173-2 11161D(5/10) 2005173-2 ISP 85
173-2 11165N(5/10) 2005173-2 ISP 459
173-2 11167D(5/18) 2005173-2 ISP 510
173-2 11167N(5/17) 2005173-2 ISP 510
173-2 11167N(5/18) 2005173-2 ISP 255
173-2 11167N(5/18)2 2005173-2 ISP 510
173-2 11171D(5/18) 2005173-2 ISP 255
173-2 11171N(5/18) 2005173-2 ISP 510
173-2 11172D(5/18) 2005173-2 ISP 510
173-2 11172N(5/18) 2005173-2 ISP 272
173-2 11172N(5/18)2 2005173-2 ISP 510
173-2 11173D(5/18) 2005173-2 ISP 221
173-2 11202D(5/20) 2005173-2 ISP 136
173-2 11202N(5/20) 2005173-2 ISP 408
173-2 11202N(5/20)2 2005173-2 ISP 374
173-2 11203D(5/20) 2005173-2 ISP 102
173-2 11203D(5/24) 2005173-2 ISP 136
173-2 11203D(5/24)2 2005173-2 ISP 510
173-2 11203N(5/20) 2005173-2 ISP 510
173-2 11203N(5/24) 2005173-2 ISP 374
173-2 11203N(5/24)2 2005173-2 ISP 493
173-2 11204D(5/20) 2005173-2 ISP 357
173-2 11204D(5/20)2 2005173-2 ISP 510
173-2 11204N(5/20) 2005173-2 ISP 153
173-2 11204N(5/24) 2005173-2 ISP 510
173-2 11205D(5/24) 2005173-2 ISP 17
173-2 11205N(5/24) 2005173-2 ISP 493
173-2 11105D(3/11) 2005173-2 ISP 1020
173-2 11157N(5/5) 2005173-2 ISP 357
173-2 11161D(5/10) 2005173-2 ISP 85
173-2 11165N(5/10) 2005173-2 ISP 459
173-2 11167D(5/18) 2005173-2 ISP 510
173-2 11167N(5/17) 2005173-2 ISP 510
173-2 11167N(5/18) 2005173-2 ISP 255
173-2 11167N(5/18)2 2005173-2 ISP 510
173-2 11171D(5/18) 2005173-2 ISP 255
173-2 11171N(5/18) 2005173-2 ISP 510
173-2 11172D(5/18) 2005173-2 ISP 510
173-2 11172N(5/18) 2005173-2 ISP 272
173-2 11172N(5/18)2 2005173-2 ISP 510
173-2 11173D(5/18) 2005173-2 ISP 221
173-2 11202D(5/20) 2005173-2 ISP 136
173-2 11202N(5/20) 2005173-2 ISP 408
173-2 11202N(5/20)2 2005173-2 ISP 374
173-2 11203D(5/20) 2005173-2 ISP 102
173-2 11203D(5/24) 2005173-2 ISP 136
173-2 11203D(5/24)2 2005173-2 ISP 510
173-2 11203N(5/20) 2005173-2 ISP 510
173-2 11203N(5/24) 2005173-2 ISP 374
173-2 11203N(5/24)2 2005173-2 ISP 493
173-2 11204D(5/20) 2005173-2 ISP 357
173-2 11204D(5/20)2 2005173-2 ISP 510
173-2 11204N(5/20) 2005173-2 ISP 153
173-2 11204N(5/24) 2005173-2 ISP 510
173-2 11205D(5/24) 2005173-2 ISP 17
173-2 11205N(5/24) 2005173-2 ISP 493
SELECT a.in_pumno, a.in_code, a.in_dcno, a.in_amt, b.pr_amt , a.in_amt-b.pr_amt , a.in_vendor
FROM (
FROM (
SELECT in_code, in_pumno, in_dcno, ifnull( sum(in_amount), 0 ) as in_amt, in_vendor
FROM in_table
WHERE in_pumno = '2005173-2'
GROUP BY in_code
) AS a
LEFT JOIN (
FROM in_table
WHERE in_pumno = '2005173-2'
GROUP BY in_code
) AS a
LEFT JOIN (
SELECT pr_code, ifnull(sum(pr_amount), 0 ) as pr_amt
FROM pr_table
WHERE pr_pumno = '2005173-2'
GROUP BY pr_code
) AS b ON a.in_code = b.pr_code
ORDER BY a.in_pumno
LIMIT 0 , 30
FROM pr_table
WHERE pr_pumno = '2005173-2'
GROUP BY pr_code
) AS b ON a.in_code = b.pr_code
ORDER BY a.in_pumno
LIMIT 0 , 30
재고 수량...쿼리 출력결과(약 40초 걸림)
in_pumno in_code in_dcno ifnull( a.in_amt , 0 ) ifnull( b.pr_amt , 0 ) ifnull( a.in_amt , 0 ) - ifnull( b.pr_amt , 0 ) in_vendor
2005173-2 3SILKR001J8STV 11064N 17 17 0 ISP
2005173-2 3SILKR001L1SH6 11117N 17 17 0 ISP
2005173-2 3SILKR001MWBNC 11165N 17 17 0 ISP
2005173-2 3SILKR001QFRM3 11241N 17 17 0 ISP
2005173-2 3SILKR001RTZ7N 11275N 17 17 0 ISP
2005173-2 3SILKR001F2WDS 10485D 17 17 0 ISP
2005173-2 3SILKR001KQFJL 11107N 17 17 0 ISP
2005173-2 3SILKR001MNQBS 11162N 17 17 0 ISP
2005173-2 3SILKR001QC02T 11235N 17 17 0 ISP
2005173-2 3SILKR001RGHGW 11265D 17 17 0 ISP
2005173-2 3SILKR001KKSHZ 11104D 17 17 0 ISP
2005173-2 3SILKR001LND5B 11135D 17 17 0 ISP
2005173-2 3SILKR001Q15N2 11227N 17 17 0 ISP
2005173-2 3SILKR001R4BP9 11261N 17 17 0 ISP
2005173-2 3SILKR001K7SY4 11094N 17 17 0 ISP
2005173-2 3SILKR001LF7R0 11131N 17 17 0 ISP
2005173-2 3SILKR001PXD6X 11224N 17 17 0 ISP
2005173-2 3SILKR001QWNBR 11251D 17 17 0 ISP
2005173-2 3SILKR001JRB8G 11077N 17 17 0 ISP
2005173-2 3SILKR001L834Y 11125D 17 17 0 ISP
2005173-2 3SILKR001P8T5R 11205N 17 17 0 ISP
2005173-2 3SILKR001QPYGD 11245N 17 17 0 ISP
2005173-2 3SILKR001SLLKV 11297D 17 17 0 ISP
2005173-2 3SILKR001J8SV3 11064N 17 17 0 ISP
2005173-2 3SILKR001L1SHG 11117N 17 17 0 ISP
2005173-2 3silkr001mwbnm 11165N 17 17 0 ISP
2005173-2 3SILKR001QHLF0 11241D 17 17 0 ISP
2005173-2 3SILKR001RTZ7X 11275N 17 17 0 ISP
2005173-2 3SILKR001F2WF1 10485N 17 17 0 ISP
2005173-2 3SILKR001KQJBK 11107N 17 17 0 ISP
2005173-2 3SILKR001J8STV 11064N 17 17 0 ISP
2005173-2 3SILKR001L1SH6 11117N 17 17 0 ISP
2005173-2 3SILKR001MWBNC 11165N 17 17 0 ISP
2005173-2 3SILKR001QFRM3 11241N 17 17 0 ISP
2005173-2 3SILKR001RTZ7N 11275N 17 17 0 ISP
2005173-2 3SILKR001F2WDS 10485D 17 17 0 ISP
2005173-2 3SILKR001KQFJL 11107N 17 17 0 ISP
2005173-2 3SILKR001MNQBS 11162N 17 17 0 ISP
2005173-2 3SILKR001QC02T 11235N 17 17 0 ISP
2005173-2 3SILKR001RGHGW 11265D 17 17 0 ISP
2005173-2 3SILKR001KKSHZ 11104D 17 17 0 ISP
2005173-2 3SILKR001LND5B 11135D 17 17 0 ISP
2005173-2 3SILKR001Q15N2 11227N 17 17 0 ISP
2005173-2 3SILKR001R4BP9 11261N 17 17 0 ISP
2005173-2 3SILKR001K7SY4 11094N 17 17 0 ISP
2005173-2 3SILKR001LF7R0 11131N 17 17 0 ISP
2005173-2 3SILKR001PXD6X 11224N 17 17 0 ISP
2005173-2 3SILKR001QWNBR 11251D 17 17 0 ISP
2005173-2 3SILKR001JRB8G 11077N 17 17 0 ISP
2005173-2 3SILKR001L834Y 11125D 17 17 0 ISP
2005173-2 3SILKR001P8T5R 11205N 17 17 0 ISP
2005173-2 3SILKR001QPYGD 11245N 17 17 0 ISP
2005173-2 3SILKR001SLLKV 11297D 17 17 0 ISP
2005173-2 3SILKR001J8SV3 11064N 17 17 0 ISP
2005173-2 3SILKR001L1SHG 11117N 17 17 0 ISP
2005173-2 3silkr001mwbnm 11165N 17 17 0 ISP
2005173-2 3SILKR001QHLF0 11241D 17 17 0 ISP
2005173-2 3SILKR001RTZ7X 11275N 17 17 0 ISP
2005173-2 3SILKR001F2WF1 10485N 17 17 0 ISP
2005173-2 3SILKR001KQJBK 11107N 17 17 0 ISP
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기
댓글 58개
덤프 데이타 좀 같이 올려주세요.
외부 미팅이 있어서 나갔다와야 하네요. 이따가 다시 볼께요.
40초 걸렸다면 좀 심한데용..
전체 데이터가 아니라면
전체 덤프데이터가 있어야 비교를 할수 있을것 같네요..
http://kunwi.co.kr/gunwi/board.php?bo_table=B23&wr_id=440&page=0&sca=&sfl=&stx=&sst=&sod=&spt=0&page=0
덤프자료 올려둔 주소입니다. 이곳에는 그림파일만 올리게 되어있네요.^^
입고, 출고 테이블 코드로 비교해서 같은 놈끼리 합산내는건데요.
재고 테이블을 별도로 운영하는 방안을 강구해야겠네요.
처음에는 속도에 전혀 문제가 없었는데 갈수록 태산이네요.
즐거운 오후되세요.
ALTER TABLE `test1`.`pr_table` ADD INDEX `pr_mix1` ( `pr_pumno` , `pr_code` );
select in_code, max(in_pumno), max(in_dcno), sum(in_amt), sum(pr_amt), sum(in_amt) - sum(pr_amt), max(in_vendor) from (
SELECT in_code, in_pumno, in_dcno, SUM( in_amount ) as in_amt, in_vendor, 0 as pr_amt
FROM in_table
WHERE in_pumno = '2005173-2'
GROUP BY in_code
union all
SELECT pr_code as in_code, '' as in_pumno, '' as in_dcno, 0 as in_amt,'' as in_vendor, IFNULL( SUM( pr_amount ) , 0 ) AS pr_amt
FROM pr_table
WHERE pr_pumno = '2005173-2'
GROUP BY pr_code
) a
group by in_code
order by in_code
LIMIT 30;
데이타가 맞는지 확인바랍니다.
subquery한 테이블끼리 outer join 시에는 index를 사용할 방법이 없습니다.(mysql 메뉴얼에는 있을려나 모르겠네요.) 아.. .관리자님이 산 책만 있어도 좀더 쉽게 할텐데....
#1267 - Illegal mix of collations (euckr_korean_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation 'UNION'
select in_code, max(in_pumno), max(in_dcno), sum(in_amt), sum(pr_amt), sum(in_amt) - sum(pr_amt), max(in_vendor) from (
SELECT in_code, in_pumno, in_dcno, SUM( in_amount ) as in_amt, in_vendor, 0 as pr_amt
FROM in_table
WHERE in_pumno = '2005173-2'
GROUP BY in_code
union all
SELECT pr_code as in_code, '' as in_pumno, '' as in_dcno, 0 as in_amt,'' as in_vendor, IFNULL( SUM( pr_amount ) , 0 ) AS pr_amt
FROM pr_table
WHERE pr_pumno = '2005173-2'
and pr_code in(select distinct(in_code) from in_table)
GROUP BY pr_code
) a
group by in_code
order by in_code
LIMIT 30;
-- 질의 실행시간 0.2347 초
엄청 빠르네요..
JOIN을 삭제하고 해서 그런가요.. 대단하십니다.^^
역시 쿼리는 어떤 방향으로 접근하느냐에 따라서 확실히 틀려지네요^^
어쩌면 쿼리를 자유자제로 구사할 수 있을까요.
실험이겠죠. 오로지 실험.........
컴대장님 서버에서 40초 걸리셨다면
이 쿼리는 2초 정도 걸리겠네요...
데이타베이스는 utf8_unicode_ci
테이블은 euckr_korean_ci
필드도 euckr_korean_ci
이래서 에러가 발생한것인가요?
혹 어느놈의 케릭셋을 변경해야할까요?
그걸 맞추어 줘야 할것 같습니다.
전 모두 utf8로 맞추었습니다.
근데 케릭셋을 강제로 바꾸면 기존 데이터 한글이 깨지겠죠?...ㅠㅠ
시간되시면 db는 uft8로
테이블과 필드는 euckr로
설정하셔서 테스트 부탁드립니다.
저는 테이블과 필드 모두 euckr이거든요.
올려주신 덤프파일 열어서
테이블 생성하는 구문에서 케릭터셋 utf8바꾸고 덤프파일 업로드 하시면 됩니다.
결과 파일을 엑셀로 올려두었습니다.
한번 봐 주십시오.
http://kunwi.co.kr/gunwi/board.php?bo_table=B23&wr_id=441
그러나 컴대장님께서 올려놓으신 원본 소스코드와는 올려주신 데이터셋과
결과가 동일합니다.
SELECT
in_pumno,
in_code,
in_dcno,
in_amt,
pr_amt,
in_amt-pr_amt,
in_vendor
from (
SELECT
A.in_pumno,
A.in_code,
A.in_dcno,
ifnull(sum(A.in_amount), 0) as in_amt,
ifnull(sum(B.pr_amount), 0) as pr_amt,
A.in_vendor
FROM in_table A
LEFT JOIN pr_table B ON (A.in_code=B.pr_code AND A.in_pumno=B.pr_pumno)
WHERE A.in_pumno = '2005173-2'
GROUP BY A.in_code
) T
ORDER BY in_pumno
-- 질의 실행시간 0.1480 초
살펴볼게요 ㅋㅋ
-----------------------
-- 원본
SELECT
a.in_pumno,
a.in_code,
a.in_dcno,
a.in_amt,
b.pr_amt,
a.in_amt-b.pr_amt,
a.in_vendor
FROM (
SELECT in_code, in_pumno, in_dcno, ifnull( sum(in_amount), 0 ) as in_amt, in_vendor
FROM in_table
WHERE in_pumno = '2005173-2'
GROUP BY in_code
) AS a
LEFT JOIN (
SELECT pr_code, ifnull(sum(pr_amount), 0 ) as pr_amt
FROM pr_table
WHERE pr_pumno = '2005173-2'
GROUP BY pr_code
) AS b ON a.in_code = b.pr_code
ORDER BY a.in_pumno
-- 질의 실행시간 4.6706 초
-- 5,286 합계
SELECT
in_pumno,
in_code,
in_dcno,
in_amt,
pr_amt,
in_amt-pr_amt,
in_vendor
FROM (
SELECT
A.in_pumno,
A.in_code,
A.in_dcno,
ifnull(sum(A.in_amount), 0) as in_amt,
ifnull(sum(B.pr_amount), 0) as pr_amt,
A.in_vendor
FROM in_table A
LEFT JOIN pr_table B ON (A.in_code=B.pr_code AND A.in_pumno=B.pr_pumno)
WHERE A.in_pumno = '2005173-2'
GROUP BY A.in_code
) T
ORDER BY in_pumno
-- 질의 실행시간 0.1480 초
-- 5,286 합계
-----------------------------
55,877 합계 - in
73,021 합계 - pr
이렇게 데이터가 들어 있는거 아닌가요?
이 상태에서 컴대장님 원본 쿼리를 날려보면 약 5천개 좀 넘는 결과가 나옵니다.
몇날 몇일을 끙끙대다가 여기에 어렵게 질문을 올렸는데 해결되었네요.
필드순서가 바뀌었네요..ㅋㅋ 두번 덕분에 어려운 과제한개를 해결했네요.
쿼리 공부는 해도 뭐가 뭔지 잘 모르겠네요. 머리에 한계인가 봅니다.
다시한번 테스트 해보고 글 적겠습니다. 다시한번 두분께 감사합니다.
----
SELECT
A.in_pumno,
A.in_code,
A.in_dcno,
ifnull(sum(A.in_amount), 0) as in_amt,
ifnull(sum(B.pr_amount), 0) as pr_amt,
ifnull(sum(A.in_amount), 0)-ifnull(sum(B.pr_amount), 0) as stock,
A.in_vendor
FROM in_table A
LEFT JOIN pr_table B ON (A.in_code=B.pr_code AND A.in_pumno=B.pr_pumno)
WHERE A.in_pumno = '2005173-2'
GROUP BY A.in_code
-- 질의 실행시간 0.0030 초
in_amt 값이 틀리게 나오는듯 한데요.
한번 검토바랍니다.^^
한가지 질문 드릴것이 in_table의 in_code는 중복이 안되는 데이터 인가요?
그렇다면 다음과 같이 간단하게.. 속도만 쿼리 짜봤습니다~
왠지 뻘짓한것같은 ㅠ_ㅠ;; 속도만 빠릅니다 ㅎㅎ 0.0452초
SELECT A.in_pumno, A.in_code, A.in_dcno, A.in_amount, SUM( B.pr_amount ) AS pr_amt, A.in_amount - SUM( B.pr_amount ) AS stoc, A.in_vendor
FROM in_table A, pr_table B
WHERE A.in_pumno = '2005173-2'
AND A.in_pumno = B.pr_pumno
AND A.in_code = B.pr_code
GROUP BY B.pr_code
중복은 없네요 ㅎㅎ; 중복없다는 조건에서만 유효한 쿼리같아요^^;
어디가 문제인지 다시한번 보도록 하겠습니다.
관심가져주셔서 감사합니다.
행복한 주말되세요.
관리자님 쿼리가 제일 깔끔하네요^^
-----------------
select
'2005173-2' as in_pumno,
in_code,
max(in_dcno),
sum(in_amt),
sum(pr_amt),
sum(in_amt) - sum(pr_amt) as stock,
max(in_vendor)
from (
SELECT
in_code,
in_dcno,
SUM(in_amount) as in_amt,
in_vendor,
0 as pr_amt
FROM in_table
WHERE in_pumno = '2005173-2'
GROUP BY in_code
union all
SELECT
pr_code as in_code,
'' as in_dcno,
0 as in_amt,
'' as in_vendor,
IFNULL( SUM( pr_amount ) , 0 ) AS pr_amt
FROM pr_table
WHERE pr_pumno = '2005173-2'
and pr_code in(select distinct(in_code) from in_table)
GROUP BY pr_code
) T
group by in_code
order by in_code
---------------
-- 질의 실행시간 0.2368 초
검색 조건이 품번으로 할때도 있지만 다른 조건의 검색도 있기에 '2005173-2' as in_pumno 부분을 수정하였습니다. 관심가져 주신 모든 분들께 감사의 인사를 드립니다. 행복하세요.^^
SELECT in_pumno, in_code, max( in_dcno ) , sum( in_amt ) , sum( pr_amt ) , sum( in_amt ) - sum( pr_amt ) AS stock, max( in_vendor )
FROM (
SELECT in_pumno, in_code, in_dcno, SUM( in_amount ) AS in_amt, in_vendor, 0 AS pr_amt
FROM in_table
WHERE 조건식
GROUP BY in_code
UNION ALL SELECT pr_pumno AS in_pumno, pr_code AS in_code, '' AS in_dcno, 0 AS in_amt, '' AS in_vendor, IFNULL( SUM( pr_amount ) , 0 ) AS pr_amt
FROM pr_table
WHERE 조건식1
AND pr_code
IN (
SELECT DISTINCT (
in_code
)
FROM in_table
)
GROUP BY pr_code
)T
GROUP BY in_code
ORDER BY in_code
LIMIT 0 , 30
SELECT in_code, in_dcno, in_amount, ifnull(sum(pr_amount), 0) as pr_amt, (in_amount - ifnull(sum(pr_amount), 0)) as amt, in_vendor
FROM `in_table` a left join pr_table b on (a.in_code = b.pr_code)
WHERE in_pumno = '2005173-2'
group by in_code
order by in_code
너무 감사하구요. 내일 바로 적용해 보도록 하겠습니다.
집에 컴퓨터 없으니 무인도에 유배된 기분이네요.
지금은 누나집....ㅠㅠ
본문 쿼리에만 충실하게 코드를 짰는데, 생각해보니 관리자님 코드로 해도 될것 같습니다. UNION ALL 쿼리는 resultset 이 많아질수록 속도가 느려집니다.
원 테이블에서
ALTER TABLE `in_table` ADD INDEX `in_mix1` ( `in_code` , `in_pumno` ); 를 추가하시는것 잊지 마시구요.
인덱스를 추가하고 나서 explain 을 해보니 결과가 참 이쁘게 나옵니다.
in_code가 유일할때에만 적용됩니다.
테이블에는 in_code가 중복이 가능합니다.
in_code가 동일한 것이 두개가 되어버리면 결과가 틀려집니다.
순도뤼님 께서 올려주신 소스와 동일한 이유죠..
in_code 중복처리해서 퇴근하고 다시 머리 짜봐야겠어요! ^^
순도뤼님 쿼리는 아래 두행이 누락됩니다.
"2005173-2";"3SILKR001STRKV";"11303N";"17";"0";"17";"ISP"
"2005173-2";"3SILKR001STRL5";"11303N";"17";"0";"17";"ISP"
저는 inner join 걸어서 누락됬네요^ ^!!
explain 걸어서 확연히 다름을 확인했어요~
좋은 가르침 감사드려요~!!
같은 Left Join문인데 어떻게 사용하느냐에 따라 엄청난 결과를 초래하네요.
아는것도 중요하지만 쓰임새를 알고 효율적으로 사용하는것이 중요하군요.
감사한 분이 한분 늘었네요. 무지 행복합니다.
늘 행복이 충만한 삶되시길....^^
다른 방법도 잇을거 같은데요.
테이블 자료를 볼수가 없네요
SELECT sum( pr_amount )
FROM pr_table
WHERE pr_pumno = a.in_pumno
AND pr_code = a.in_code
GROUP BY pr_code ) , 0
) AS sum_pr_amount, (
SUM( in_amount ) - ifnull( (
SELECT sum( pr_amount )
FROM pr_table
WHERE pr_pumno = a.in_pumno
AND pr_code = a.in_code
GROUP BY pr_code ) , 0
)
) AS remain_amount
FROM `in_table` a
WHERE `in_pumno` = '2005173-2'
GROUP BY `in_code` ASC
속도는 아주 잘나오는데 맞는 데이타 인지는 모르겟네요
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
버전이 낮아서 그런걸까요? 4.1.14 버전입니다.
지원안되는 버전 같습니다.
저는 mysql 5.대에서 테스트 하였습니다.
explain 을 해보니 관리자님 쿼리랑 결과가 비슷합니다.
아마 속도도 비슷할것 같습니다.
mysql에서 inline subquery가 되는줄 처음 알았습니다.
oracle이 mysql 인수하더니 좋은게 많아지네요.
확인해 주셔서 감사합니다.
한번더 살펴봐야 겠습니다.^^
공부가 많이 되네요..
in_code 와 pr_code 가 고유키인가요? (pk or unique)
쿼리 결과에서 건수가 동일하길래 유니크한것 같았는데.. 스키마엔 index만 적용되어 있네요.
똥산너구리님 말대로 in_code가 고유키가 아니면, n:n 으로 join 되는 상황이 생기면 결과가 틀려지게 됩니다. 고유키가 아닌 경우에는 join 해서는 안됨.
저는 인덱스나 유니크나 별반 차이가 없는 줄 알았는데..
예전에는 UNIQUE KEY로 설정했는데 이번에 인덱스로 바꾸어 버렸네요..ㅎ
관건은 mysql 4.대 초반에서 되야 한다는건가요?
정확하게 나올려면
관계나 필드값의 설명 중복 여부 등등히 확실해야 겟죠.
일단 여러분들이 도와주신 덕분에 검색 속도가 만족할만한 수준까지 나온다고 합니다.
입고수량이 많은 데이터인 경우 출고 횟수도 많기 때문에 검색속도가 느릴뿐이지,
한번 입고에 100번 민만의 출고가 이루어지는 품목은 금방 검색되니까,
문제가 없을듯 합니다.
다시한번 관심가지고 도와주신 분들께 감사드립니다.^^