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 38862 게시물 읽기
No. 38862
왜 더 느려지죠?
작성자
김진국(kimscom)
작성일
2011-09-15 11:47ⓒ
2011-09-15 11:51ⓜ
조회수
4,473

일전에 문의드려 아래와 같이 1) 번 쿼리를 2)번 쿼리와 같이 수정해서 더 낳은 실행계획이 보였는데 막상 실행해보면 시간이 오히려 조금 더 걸립니다.
해당 쿼리만 실행하면 분명히 2)번 쿼리시간 더 빠릅니다.
그런데 아래 쿼리는 WITH 절에 사용된 쿼리로 다른 쿼리에서 여러번 반복되어 사용이 되어집니다. 전체를 돌려보면 더 오래 걸리네요.
어떤 부분때문에 이런현상이 나타나는건가요?  

 1)번 쿼리 ===================================================================================================================================

   SELECT DISTINCT FTO       GFM
          , SUBSTR(BID,1,18) ITEM
          , NVL(CQ,1)     MQ
       FROM MM1
      WHERE (SUBSTR(BID,1,18), FTO)
           IN (SELECT SUBSTR(BID,1,18) ITEM
                    , MAX(FTO) GFM
                 FROM MM1
                WHERE ENAME ='MT'
                  AND (FTO, CONID)
                    IN (SELECT GFM,STID
                            FROM MG1
                      WHERE PNID   = '201136'
                        AND AR     = 'WARE'
                             AND GQY > 0
                          )
             GROUP BY SUBSTR(BID,1,18)
            )


--------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name               | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH UNIQUE                     |                    |      1 |   2255 |     50 |00:00:00.38 |     909 |  1012K|  1012K|          |
|*  2 |   HASH JOIN                      |                    |      1 |   2255 |  15450 |00:00:00.36 |     909 |   741K|   741K| 1224K (0)|
|   3 |    VIEW                          | VW_NSO_1           |      1 |   2417 |   2139 |00:00:00.34 |     721 |       |       |          |
|   4 |     HASH GROUP BY                |                    |      1 |   2417 |   2139 |00:00:00.34 |     721 |   805K|   805K| 1143K (0)|
|*  5 |      HASH JOIN                   |                    |      1 |   2417 |    196K|00:00:00.03 |     721 |   993K|   993K| 1522K (0)|
|*  6 |       TABLE ACCESS BY INDEX ROWID| MG1                |      1 |   7719 |   6703 |00:00:00.02 |     533 |       |       |          |
|*  7 |        INDEX RANGE SCAN          | PK_MG1             |      1 |   7722 |  12150 |00:00:00.01 |     106 |       |       |          |
|*  8 |       TABLE ACCESS FULL          | MM1                |      1 |   8212 |  16174 |00:00:00.01 |     188 |       |       |          |
|   9 |    TABLE ACCESS FULL             | MM1                |      1 |  16423 |  16468 |00:00:00.01 |     188 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("ITEM"=SUBSTR("BID",1,18) AND "FTO"="GFM")
   5 - access("FTO"="GFM" AND "CONID"="STID")
   6 - filter("GQY">0)
   7 - access("PNID"='201136' AND "AR"='WARE')
   8 - filter("ENAME"='MT')
   
               
2)번 쿼리 ===================================================================================================================================          
 
  SELECT MAX(FTO) GFM
     , SUBSTR(BID, 1, 18) ITEM
     , NVL(MAX(CQ) KEEP(DENSE_RANK LAST ORDER BY FTO), 1) MQ
  FROM MM1
 WHERE ENAME = 'MT'
   AND (FTO, CONID) IN (SELECT GFM,STID
                         FROM MG1
                        WHERE PNID   = '201136'
                         AND AR     = 'WARE'
                          AND GQY > 0
                       )
 GROUP BY SUBSTR(BID, 1, 18);
 
 -------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                 | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  SORT GROUP BY                |                      |      1 |      1 |     50 |00:00:00.09 |     721 |   549K|   549K|  487K (0)|
|*  2 |   HASH JOIN RIGHT SEMI        |                      |      1 |      1 |  14896 |00:00:00.05 |     721 |   993K|   993K| 1490K (0)|
|*  3 |    TABLE ACCESS BY INDEX ROWID| MG1                  |      1 |   7719 |   6703 |00:00:00.03 |     533 |       |       |          |
|*  4 |     INDEX RANGE SCAN          | PK_MG1               |      1 |   7722 |  12150 |00:00:00.01 |     106 |       |       |          |
|*  5 |    TABLE ACCESS FULL          | MM1                  |      1 |   8212 |  16174 |00:00:00.01 |     188 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("FTO"="GFM" AND "CONID"="STID")
   3 - filter("GQY">0)
   4 - access("PNID"='201136' AND "AR"='WARE')
   5 - filter("ENAME"='MT')
  

 

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

(1) BIND 변수 미사용 Parsing overhead 있을 것으로 추측

 

(2) 인덱스 추가 검토

MG1에서 GQY > 0 조건으로 절반 정도 필터링 되는 것 같습니다.

MG1으로의 Random access를 줄이기 위해 PNID + AR + CQY 로 결합 인덱스를 추가하는 것을 검토해볼 수 있겠네요. 물론 PK와 중복되긴 하지만 상당히 자주 사용되는 쿼리로 보이기 때문에 ...

 

(3) 연결고리 인덱스 추가 검토 및 NL JOIN으로 변경

MM1의 ENAME, FTO, CONID 로 연결고리 인덱스 추가.

자주 사용되는 OLTP성 쿼리의 경우 Nested loop join으로 하는 것이 Buffer cache에 좀 더 오래 남아있을 확률이 커지며, Hash 조인등에 비해 CPU 사용률이 적음.

 

 

 

아무개님이 2011-09-15 15:34에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38866오라클 TEST DB 에 값을 LIVE DB 에 넣기 문의 [1]
김용남
2011-09-16
3545
38865문자값 정렬하기. [2]
알려주세요.
2011-09-15
4590
38864NL Join을 HASH Join으로 바꾸려면... [3]
궁금이
2011-09-15
4750
38862왜 더 느려지죠? [1]
김진국
2011-09-15
4473
388619/30정보 보호법 강화에 따른 개인정보 암호화...어떤 방식으로 진행하시나요 ??? [4]
궁금합니다.
2011-09-15
5384
38860where 절에서 in 구문.. [2]
아폴론
2011-09-15
4271
38859비효율적인 쿼리 튜닝 부탁드립니다. [2]
jinkuidong
2011-09-15
6333
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다