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 38841 게시물 읽기
No. 38841
쿼리 비효율 ?
작성자
김진국(kimscom)
작성일
2011-09-05 17:43
조회수
4,094

SELECT DISTINCT FTO GFM  ------------------------------------------> 2,115 건
               , SUBSTR(BID,1,18) ITEM
               , NVL(CTY,1)     MCQ
    FROM TAB1
 WHERE (SUBSTR(BID,1,18), FTO)
           IN (SELECT SUBSTR(BID,1,18) ITEM   -----------------------> 2,115 건
                                , MAX(FTO) GFM
                     FROM TAB1
                 WHERE ENAME ='ESST'
                       AND (FTO, CSID)
                                 IN (SELECT GFM,STID  ---------------------------> 6,380 건
                                           FROM TAB2
                                       WHERE PDATE   = '201136'
                                              AND AAR     = 'HW'
                                              AND GQY > 0
                                      )
                GROUP BY SUBSTR(BID,1,18)
                )

 

위와 같은 쿼리가 있습니다.

각각의 서브쿼리 옆의 숫자는 결과 건수입니다.
실행계획을 보면 Cartesian Product이 생겨서 뻥튀기 되었다가 건수가 줄어들게 됩니다.

이쿼리를 좀 더 효율적으로 쿼리를 수정할수 없나요?

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

SELECT SUBSTR(bid, 1, 18) item
     , MAX(fto) gfm
     , NVL(MAX(cty) KEEP(DENSE_RANK LAST ORDER BY fto), 1) mcq
  FROM tab1
 WHERE ename = 'ESST'
   AND (fto, csid) IN (SELECT gfm, stid
                         FROM tab2
                        WHERE pdate = '201136'
                          AND aar   = 'HW'
                          AND gqy   > 0
                       )
 GROUP BY SUBSTR(bid, 1, 18)
;

IN 절도 Exists 나 Join 으로 바꿀수도 있겠지만
두 테이블간의 관계를 정확하게 몰라서 섣불리 건드릴 수 없네요.
일단 같은 테이블 두번 읽는 부분만 고쳤습니다.

마농(manon94)님이 2011-09-05 19:28에 작성한 댓글입니다.

답변 감사합니다. 실행계획이 개선되었습니다..

김진국(kimscom)님이 2011-09-06 18:12에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38844같은이름의 컬럼을 여러데이터에 넣을수없나요?/ [3]
강병민
2011-09-06
3529
38843양수+음수일때 음수값 처리는 어떻게 해야하나요? [4]
성이
2011-09-06
3881
38842SQL로 CarrageReturn 처리하는 방법? [1]
윤석민
2011-09-05
4177
38841쿼리 비효율 ? [2]
김진국
2011-09-05
4094
38840프로시져가 무한 루프를 도는 것 같은데요 [7]
최두철
2011-09-05
7722
38839오라클 시간계산시 익일 시간 [5]
강영호
2011-09-03
5201
38838interpolation SQL 을 어떻게 구현하면 빠를까요?
부족한
2011-09-02
3314
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.027초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다