database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40445 게시물 읽기
No. 40445
OUTER JOIN 튜닝
작성자
도와주세요.
작성일
2014-04-30 16:40
조회수
7,325

많은 도움 받고 있고 있습니다.

한가지 도움이 필요해 이렇게 글을 올립니다.

SELECT A.FACTORY,B.CTG3, A.LOT_ID ,A.MAT_ID,A.MAT_DESC,A.MAT_TYPE,A.UNIT,A.SLOC,
D.QTY,
             A.AVAIL_IN_J_QTY AS AVAIL_QTY,
             A.AVALIABLE_QTY, A.UNRESTRICT_QTY, A.RESERVED_QTY, A.INSP_QTY, A.BLOCKED_QTY, A.AVAIL_IN_J_QTY, A.DEPOSIT_PR_QTY,
         B.IN_QTY, ROUND((A.AVAIL_IN_J_QTY + A.INSP_QTY +A.BLOCKED_QTY) / B.IN_QTY,3) AS FACTOR_COUNT,
             A.DEADLINE_DATE, A.EXPIRE_DATE,
             A.PURITY, A.PURITY_UNIT, A.NMP, A.NMP_UNIT, C.REMARKK
     FROM  TI_STOCK A, TS_MATERIAL B, TD_STOCK_REMARK C
 ,(SELECT FACTORY, MAT_ID, LOT_ID, QTY FROM MESMGR.CWIPBATMAT WHERE FACTORY ='K001' AND MVT IN ('901','Z63') AND QTY>0) D
    WHERE  A.MAT_ID = B.MAT_ID
      AND (A.AVAIL_IN_J_QTY >0 OR A.INSP_QTY >0 OR A.BLOCKED_QTY >0 OR A.RESERVED_QTY >0)
      AND A.FACTORY = C.FACTORY(+) AND A.MAT_ID =C.MAT_ID(+) AND A.LOT_ID = C.LOT_ID(+) AND A.SLOC = C.SLOC(+)
      AND A.FACTORY = D.FACTORY(+) AND A.MAT_ID = D.MAT_ID(+) AND A.LOT_ID = D.LOT_ID(+)
 AND B.CTG1 = 'G01'
 AND B.MAT_TYPE = 'FERT'
ORDER BY A.FACTORY, A.MAT_ID, A.LOT_ID, A.EXPIRE_DATE ASC,A.LOT_ID ASC;

이거에 실행 계획이

   0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=208K Card=129 Bytes=32K)
   1    0   SORT (ORDER BY) (Cost=208K Card=129 Bytes=32K)
   2    1     NESTED LOOPS (OUTER) (Cost=208K Card=129 Bytes=32K)
   3    2       NESTED LOOPS (Cost=208K Card=129 Bytes=23K)
   4    3         NESTED LOOPS (Cost=207K Card=827 Bytes=109K)
   5    4           TABLE ACCESS (BY INDEX ROWID) OF 'MESMGR.CWIPBATMAT' (TABLE) (Cost=203K Card=4K Bytes=108K)
   6    5             INDEX (RANGE SCAN) OF 'MESMGR.PK_CWIPBATMAT' (INDEX (UNIQUE)) (Cost=4K Card=432K)
   7    4           TABLE ACCESS (BY INDEX ROWID) OF 'TI_STOCK' (TABLE) (Cost=2 Card=1 Bytes=104)
   8    7             INDEX (RANGE SCAN) OF 'TI_STOCK_PK' (INDEX (UNIQUE)) (Cost=1 Card=1)
   9    3         TABLE ACCESS (BY INDEX ROWID) OF 'TS_MATERIAL' (TABLE) (Cost=1 Card=1 Bytes=51)
  10    9           INDEX (UNIQUE SCAN) OF 'TS_MATERIAL_BAK_PK' (INDEX (UNIQUE)) (Cost=0 Card=1)
  11    2       TABLE ACCESS (BY INDEX ROWID) OF 'TD_STOCK_REMARK' (TABLE) (Cost=1 Card=1 Bytes=68)
  12   11         INDEX (UNIQUE SCAN) OF 'TD_STOCK_REMARK_PK' (INDEX (UNIQUE)) (Cost=0 Card=1)

아무래도... OUTER JOIN 이 문제이지 싶어요... 쿼리 튜닝 방법 없을 까요?

부탁 드립니다.

감사합니다.

이 글에 대한 댓글이 총 2건 있습니다.

제가 보기에 특정 매출이 일어난 테이블(CWIPBATMAT)에서 공장정보 등으로 필터한 모집합에

재고, 재료, 재고기타정보를 표현하실려는것 같습니다.

문제는 order by 부분 같네요. 조인은 PK Index 조인으로서 별 문제 없어 보입니다.

화면상에서 빠르게 나올려면 모집합을 줄일수 있는 조건절을 추가하거나

rownum <= 100 같이 부분범위로 처리하시는게 어떠실지요?

 

김두잇(zeld)님이 2014-05-05 11:51에 작성한 댓글입니다.

실행계획이 이해가 안가네요.
쿼리에서의 아우터 조인은 두번(C, D)인데...
실행계획상의 아우터 조인은 한번(D) 뿐이네요?
아우터조인 대상인 D 가 오히려 제일 먼저 드라이빙되면서 아우터조인을 안하는 형상이네요?
왜 이런 실행계획이 나오는지 모르겠네요?
드라이빙 테이블만 바뀌어도 개선될듯 합니다.
ORDERED 나 LEADING 힌트를 써보세요.

마농(manon94)님이 2014-05-07 13:36에 작성한 댓글입니다.
이 댓글은 2014-05-07 13:36에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
40448데이터수정 여부 어떤 식으로 관리하세요 [1]
율리시스
2014-05-12
6105
40447연속된 시작값 종료값 [1]
이기자
2014-05-07
6766
40446날짜 계산 도와주세요 [4]
초보개발자
2014-05-07
7094
40445OUTER JOIN 튜닝 [2]
도와주세요.
2014-04-30
7325
40444데이터 베이스 필드 갯수 정의에 대하여 질문드립니다. [2]
최대호
2014-04-30
7226
40443하위값으로 채우기 [4]
이민우
2014-04-29
6760
40441오라클 테스트서버 스키마정보 실서버 반영 방법
김종욱
2014-04-24
6207
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다