본문 바로가기
DBMS/SQL튜닝

oracle hint 위치별 적용여부 테스트

by 드바 2023. 7. 4.
반응형
DBMS : oracle 19.3

힌트없음

SQL> SELECT
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;  
---------------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Bytes | Cost (%CPU)| Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   |  2705 |   697K|   790   (1)| 00:00:01 |
|*  1 |  HASH JOIN    |   |  2705 |   697K|   790   (1)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| TAB1 |  2705 |   348K|   395   (1)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')

 일반적인 인덱스 힌트(정상)

SQL> SELECT /*+ index(a tab1_ix01) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  1 |  HASH JOIN      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 |  2705 |   348K| 37056   (1)| 00:00:02 |
|   3 |    INDEX FULL SCAN      | TAB1_IX01 | 73044 | |   514   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL      | TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')

 괄호안 공백 대신 콤마 사용(정상)

SQL> SELECT /*+ index(a,tab1_ix01) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  1 |  HASH JOIN      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 |  2705 |   348K| 37056   (1)| 00:00:02 |
|   3 |    INDEX FULL SCAN      | TAB1_IX01 | 73044 | |   514   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL      | TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')
반응형

 2개 테이블 힌트 사용(정상)

SQL> SELECT /*+ index(a tab1_ix01) index(b tab2_ix01) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | |  2705 |   697K| 74113   (1)| 00:00:03 |
|*  1 |  HASH JOIN      | |  2705 |   697K| 74113   (1)| 00:00:03 |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 |  2705 |   348K| 37056   (1)| 00:00:02 |
|   3 |    INDEX FULL SCAN      | TAB1_IX01 | 73044 | |   514   (0)| 00:00:01 |
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB2 | 73045 |  9415K| 37057   (1)| 00:00:02 |
|   5 |    INDEX FULL SCAN      | TAB2_IX01 | 73045 | |   514   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')

 힌트 구문 2개 사용(앞에것만 적용됨)

SQL> SELECT /*+ index(a tab1_ix01) *//*+ index(b tab2_ix01) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  1 |  HASH JOIN      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 |  2705 |   348K| 37056   (1)| 00:00:02 |
|   3 |    INDEX FULL SCAN      | TAB1_IX01 | 73044 | |   514   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL      | TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')

 한개의 index 힌트에 여러 테이블 사용(앞에것만 적용됨 tab1_ix01)

SQL> SELECT /*+ index(a tab1_ix01 b tab2_ix01) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  1 |  HASH JOIN      | |  2705 |   697K| 37452   (1)| 00:00:02 |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 |  2705 |   348K| 37056   (1)| 00:00:02 |
|   3 |    INDEX FULL SCAN      | TAB1_IX01 | 73044 | |   514   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL      | TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 2 (U - Unused (2))
---------------------------------------------------------------------------
   2 - SEL$1 / A@SEL$1
U -  index(a tab1_ix01 b tab2_ix01)
U -  index(a tab1_ix01 b tab2_ix01)

 한개의 index 힌트에 여러 테이블 사용(앞에것만 적용됨 tab1_ix02)

SQL> SELECT /*+ index(a tab1_ix02 b tab2_ix01) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | |  2705 |   697K|  2552   (1)| 00:00:01 |
|*  1 |  HASH JOIN      | |  2705 |   697K|  2552   (1)| 00:00:01 |
|*  2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 |  2705 |   348K|  2156   (1)| 00:00:01 |
|   3 |    INDEX FULL SCAN      | TAB1_IX02 | 73044 | |   513   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL      | TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 2 (U - Unused (2))
---------------------------------------------------------------------------
   2 - SEL$1 / A@SEL$1
U -  index(a tab1_ix02 b tab2_ix01)
U -  index(a tab1_ix02 b tab2_ix01)

 순서를 바꾸니 모든 힌트 무효(E - Syntax error 메세지)

SQL> SELECT /*+ index(b tab2_ix01 a tab1_ix01 ) */
*
FROM sk.tab1 a, sk.tab2 b
WHERE a.object_id = b.object_id
AND a.owner = 'SK'
;
---------------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Bytes | Cost (%CPU)| Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   |  2705 |   697K|   790   (1)| 00:00:01 |
|*  1 |  HASH JOIN    |   |  2705 |   697K|   790   (1)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| TAB1 |  2705 |   348K|   395   (1)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| TAB2 | 73045 |  9415K|   396   (1)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   2 - filter("A"."OWNER"='SK')
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (E - Syntax error (1))
---------------------------------------------------------------------------
   1 - SEL$1
E -  index(b

 서브쿼리 힌트 없음

SQL> SELECT
*
FROM sk.tab1 a
WHERE object_id in (SELECT object_id FROM sk.tab2 b)
;
------------------------------------------------------------------------------------
| Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time    |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |    | 73040 |  9771K|   761   (1)| 00:00:01 |
|*  1 |  HASH JOIN        |    | 73040 |  9771K|   761   (1)| 00:00:01 |
|   2 |   SORT UNIQUE        |    | 73045 |   356K|   140   (0)| 00:00:01 |
|   3 |    INDEX FAST FULL SCAN| TAB2_IX01 | 73045 |   356K|   140   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL    | TAB1    | 73044 |  9415K|   396   (1)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("OBJECT_ID"="OBJECT_ID")

 서브쿼리 힌트 사용(정상)

SQL> SELECT /*+ index(a tab1_ix01) */
*
FROM sk.tab1 a
WHERE object_id in (SELECT /*+ index(b tab2_ix02) */ object_id FROM sk.tab2 b)
;
--------------------------------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      | | 73040 |  9771K| 37794   (1)| 00:00:02 |
|*  1 |  HASH JOIN      | | 73040 |  9771K| 37794   (1)| 00:00:02 |
|   2 |   SORT UNIQUE      | | 73045 |   356K|   513   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN      | TAB2_IX02 | 73045 |   356K|   513   (0)| 00:00:01 |
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| TAB1 | 73044 |  9415K| 37056   (1)| 00:00:02 |
|   5 |    INDEX FULL SCAN      | TAB1_IX01 | 73044 | |   514   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("OBJECT_ID"="OBJECT_ID")
반응형

댓글