hint 주는방법 0 6 703

by 불장작 [Oracle 기초] [2020.06.11 15:18:08]


hint를 경우에 따라서 달리 주고 싶은데 어떻게 줘야 하는지 고수님들의 조언 부탁드립니다.

SELECT A.code, B.name, B.execdate, B.orddate, B.cnt

    FROM TEST_A, TEST_B

  WHERE ((:acc_dv = 'A' and A.code = '1234')

       OR  (:acc_dv = 'B' and B.execdate = trunc(sysdate))

       OR  (:acc_dv = 'C' and B.orddate = trunc(sysdate)))

위의 쿼리를 실행할때 acc_dv = 'A' 인경우는 TEST_A_IDX1을 태우고

acc_dv = 'B' 인경우는 TEST_B_IDX1을 태우고, acc_dv = 'C' 인경우는 TEST_A_IDX2을 태우고 싶습니다. 어떻게 hint를 줘야 할까요?

by 마농 [2020.06.11 15:49:46]

힌트는 /*+ USE_CONCAT */
그런데... 조인 조건은 어디로 갔나요?


by 불장작 [2020.06.11 16:00:56]

조인은 아래와 같습니다.

SELECT A.code, B.name, B.execdate, B.orddate, B.cnt

    FROM TEST_A, TEST_B

  WHERE TEST_A.code = TEST_B.code(+)

       and ((:acc_dv = 'A' and A.code = '1234')

       OR  (:acc_dv = 'B' and B.execdate = trunc(sysdate))

       OR  (:acc_dv = 'C' and B.orddate = trunc(sysdate)))

acc_dv 가 A, B, C 3가지 경우로 나누어 HINT를 줄수 있을까요?


by 불장작 [2020.06.11 16:13:13]

주신데로 하면 acc_dv가 'A'인 경우는 속도가 잘 나오는데 'B', 'C'는 그전이랑 같습니다.

 


by ㅇㅇ준 [2020.06.11 17:33:44]

꼭 인덱스스캔을 타야한다면 union  을활용해서 쿼리를 작성하시면 되겠습니다


by 불장작 [2020.06.11 17:36:34]

네. 감사합니다.

혹 UNION 말고 다른 방법이 있나 여쭤봤습니다.

쿼리문이 길어서 .....


by 마농 [2020.06.11 17:39:09]

USE_CONCAT 이 해당 기능 힌트입니다.
단, 힌트대로 안 될 수도 있습니다.
실행계획을 확인해 보셔야 합니다.
제일 확실한 것은 UNION ALL 입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입