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 38864 게시물 읽기
No. 38864
NL Join을 HASH Join으로 바꾸려면...
작성자
궁금이(kimscom)
작성일
2011-09-15 14:03ⓒ
2011-09-15 14:04ⓜ
조회수
4,750

SELECT SUBSTR(original,1,16), CASE WHEN openid LIKE 'BUK%' THEN 'YT'
                     WHEN openid LIKE 'SUP%' THEN 'SUPT'
                     ELSE openid
                 END soldid,
       SUM(water) water
  FROM MWP a,
       TAS b,
       (
        SELECT DISTINCT a.agreeid, a.signed, a.resigned
          FROM MSP a
               (
                SELECT soldid FROM MSAGE WHERE stageid IN ('TTOT','SKOT')
               ) b
         WHERE CASE WHEN a.agreeid LIKE 'BUK%' THEN 'YT'
                    WHEN a.agreeid LIKE 'SUP%' THEN 'SUPT'
                    ELSE a.agreeid
                END = b.soldid
       ) c
 WHERE a.pkid  =  '201136'
   AND a.img   LIKE 'K%'
   AND a.water    > 0
   AND a.agreeid   IN (SELECT soldid FROM MSAGE WHERE group2 IN ('TST','STK'))
   AND a.original   = b.asscd
   AND a.openid = c.agreeid
   AND a.otp   = c.signed
   AND SUBSTR(a.original,16,1) NOT IN ('M','P')
   AND c.resigned > CASE WHEN b.ftf ='MBL' THEN 'TZEZ' ELSE 'TZNF' END
 GROUP BY
       SUBSTR(original,1,16),
       CASE WHEN openid LIKE 'BUK%' THEN 'YT'
            WHEN openid LIKE 'SUP%' THEN 'SUPT'
            ELSE openid
        END
        
       
-------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY                     |              |      1 |      1 |     50 |00:00:01.69 |   74565 |    256 |   725K|   725K|          |
|   2 |   VIEW                             |              |      1 |      1 |    786 |00:00:01.68 |   74565 |    256 |       |       |          |
|   3 |    HASH UNIQUE                     |              |      1 |      1 |    786 |00:00:01.68 |   74565 |    256 |   676K|   676K| 1168K (0)|
|   4 |     NESTED LOOPS                   |              |      1 |      1 |  30467 |00:00:00.52 |   74565 |    256 |       |       |          |
|   5 |      NESTED LOOPS                  |              |      1 |      1 |  30467 |00:00:00.24 |   13631 |    256 |       |       |          |
|   6 |       NESTED LOOPS                 |              |      1 |      1 |   2972 |00:00:03.25 |   10455 |    256 |       |       |          |
|   7 |        NESTED LOOPS SEMI           |              |      1 |      1 |   2972 |00:00:03.21 |    4491 |    249 |       |       |          |
|*  8 |         TABLE ACCESS BY INDEX ROWID| MWP          |      1 |      1 |   5287 |00:00:00.58 |    4462 |    249 |       |       |          |
|*  9 |          INDEX RANGE SCAN          | PK_MWP       |      1 |      1 |   9321 |00:00:00.54 |     139 |    138 |       |       |          |
|* 10 |         TABLE ACCESS BY INDEX ROWID| MSAGE        |     26 |     64 |      7 |00:00:00.01 |      29 |      0 |       |       |          |
|* 11 |          INDEX RANGE SCAN          | PK_MSAGE     |     26 |      1 |     25 |00:00:00.01 |       2 |      0 |       |       |          |
|  12 |        TABLE ACCESS BY INDEX ROWID | TAS          |   2972 |      1 |   2972 |00:00:00.11 |    5964 |      7 |       |       |          |
|* 13 |         INDEX RANGE SCAN           | PK_TAS       |   2972 |      1 |   2972 |00:00:00.09 |    2992 |      7 |       |       |          |
|* 14 |       INDEX RANGE SCAN             | PK_MSP       |   2972 |      1 |  30467 |00:00:00.03 |    3176 |      0 |       |       |          |
|  15 |      INLIST ITERATOR               |              |  30467 |        |  30467 |00:00:00.26 |   60934 |      0 |       |       |          |
|* 16 |       INDEX UNIQUE SCAN            | PK_MSAGE     |  60934 |      1 |  30467 |00:00:00.18 |   60934 |      0 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------


위 쿼리에서 힌트를 추가해 15,16번 실행계획부분이 HASH JOIN이 되도록 하고 싶은데 (4번에서 바뀌는게 맞죠) 어떻게 힌트를 써야 하나요?
몇가지 해봤더니 순서도 바뀌고 11번의 INDEX RANGE SCAN이 아닌 FULL TABLE SCAN으로 바뀌어 버리더군요.
 

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

 

 

 

 

SELECT /*+ use_hash(c.b) */ SUBSTR(original,1,16), CASE WHEN openid LIKE 'BUK%' THEN 'YT'

                     WHEN openid LIKE 'SUP%' THEN 'SUPT'

                     ELSE openid

                 END soldid,

       SUM(water) water

  FROM MWP a,

       TAS b,

       (

        SELECT DISTINCT a.agreeid, a.signed, a.resigned

          FROM MSP a

               (

                SELECT soldid FROM MSAGE WHERE stageid IN ('TTOT','SKOT')

               ) b

         WHERE CASE WHEN a.agreeid LIKE 'BUK%' THEN 'YT'

                    WHEN a.agreeid LIKE 'SUP%' THEN 'SUPT'

                    ELSE a.agreeid

                END = b.soldid

       ) c

 WHERE a.pkid  =  '201136'

   AND a.img   LIKE 'K%'

   AND a.water    > 0

   AND a.agreeid   IN (SELECT soldid FROM MSAGE WHERE group2 IN ('TST','STK'))

   AND a.original   = b.asscd

   AND a.openid = c.agreeid

   AND a.otp   = c.signed

   AND SUBSTR(a.original,16,1) NOT IN ('M','P')

   AND c.resigned > CASE WHEN b.ftf ='MBL' THEN 'TZEZ' ELSE 'TZNF' END

 GROUP BY

       SUBSTR(original,1,16),

       CASE WHEN openid LIKE 'BUK%' THEN 'YT'

            WHEN openid LIKE 'SUP%' THEN 'SUPT'

            ELSE openid

        END             

 

아무개님이 2011-09-15 22:24에 작성한 댓글입니다. Edit

제가 해봤던 내용입니다...  /*+ use_hash(c,b) */  로....

 

결과 아래처럼 순서가 바뀌어 나옵니다.  10번에 있던게 14번으로 바뀌어 있고..

순서는 그래도 둔채 HASH_JOIN 으로 바꾸고 싶거든요,

-------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY                     |              |      1 |      1 |     50 |00:00:04.23 |   74796 |    657 |   725K|   725K|          |
|   2 |   VIEW                             |              |      1 |      1 |    786 |00:00:04.23 |   74796 |    657 |       |       |          |
|   3 |    HASH UNIQUE                     |              |      1 |      1 |    786 |00:00:04.23 |   74796 |    657 |   676K|   676K| 1145K (0)|
|   4 |     NESTED LOOPS SEMI              |              |      1 |      1 |  30467 |00:00:04.17 |   74796 |    657 |       |       |          |
|   5 |      NESTED LOOPS                  |              |      1 |      1 |  30467 |00:00:04.17 |   74790 |    657 |       |       |          |
|   6 |       NESTED LOOPS                 |              |      1 |      1 |  30467 |00:00:03.83 |   13856 |    657 |       |       |          |
|*  7 |        HASH JOIN                   |              |      1 |      1 |   5287 |00:00:03.38 |    7805 |    614 |  1004K|   945K| 1442K (0)|
|*  8 |         TABLE ACCESS BY INDEX ROWID| MWP          |      1 |      1 |   5287 |00:00:00.04 |    4462 |      0 |       |       |          |
|*  9 |          INDEX RANGE SCAN          | PK_MWP       |      1 |      1 |   9321 |00:00:00.02 |     139 |      0 |       |       |          |
|  10 |         TABLE ACCESS FULL          | TAS          |      1 |    124K|    124K|00:00:03.24 |    3343 |    614 |       |       |          |
|* 11 |        INDEX RANGE SCAN            | PK_MSP       |   5287 |      1 |  30467 |00:00:00.42 |    6051 |     43 |       |       |          |
|  12 |       INLIST ITERATOR              |              |  30467 |        |  30467 |00:00:00.31 |   60934 |      0 |       |       |          |
|* 13 |        INDEX UNIQUE SCAN           | PK_MSAGE     |  60934 |      1 |  30467 |00:00:00.22 |   60934 |      0 |       |       |          |
|* 14 |      TABLE ACCESS BY INDEX ROWID   | MSAGE        |      4 |     64 |      4 |00:00:00.01 |       6 |      0 |       |       |          |
|* 15 |       INDEX RANGE SCAN             | PK_MSAGE     |      4 |      1 |      4 |00:00:00.01 |       2 |      0 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------------------------

궁금이(kimscom)님이 2011-09-16 13:12에 작성한 댓글입니다.
이 댓글은 2011-09-16 13:21에 마지막으로 수정되었습니다.

Join 순서를 바꾸고 싶으시면 Leading, ordered 힌트를 쓰셔야겠죠.

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