오라클 쿼리 플랜 문의드립니다. 0 5 1,738

by 박영식 [Oracle Tuning] [2019.05.29 16:41:12]


Toad for Oracle 툴을 사용하여

A(마스터), B(디테일) 테이블 간 조인 힌트 3가지 (USE_NL, USE_MERGE, USE_HASH) 플랜 결과입니다.

아래 플랜 중 어떤 내용을 보고 어느 조인 힌트를 주는것이 적합한지 확인할 수 있는건가요?

제가 알기론 Cost(비용)이 낮으면 더 좋다 라고 알고 있는데 제가 알고있는 내용이 맞는지

고수님들의 설명 부탁드리겠습니다

1. /* USE_NL(TABLE1, TABLE2) */
Plan hash value: 508370532
----------------------------------------------------------------------------------------------
| Id  | Operation                                | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                      |     5 |  1470 |    11   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                        |                      |       |          |             |            |
|   2 |   NESTED LOOPS                       |                      |     5 |  1470 |    11   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL                | TABLE1            |     4 |   536  |     3   (0)| 00:00:01 |
|*  4 |    INDEX RANGE SCAN               | TABLE2_IDX01   |     1 |         |     1   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| TABLE2            |     1 |   160  |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

 

2. /* USE_MERGE(TABLE1, TABLE2) */
Plan hash value: 84301262
----------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                     |     5 |  1470  |    23   (5)| 00:00:01 |
|   1 |  MERGE JOIN                             |                      |     5 |  1470 |    23   (5)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID  | TABLE1           |     4 |   536  |     4   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN                    | TABLE1_IDXPK  |     4 |          |     1   (0)| 00:00:01 |
|*  4 |   SORT JOIN                              |                      |     5 |   800  |    19   (6)| 00:00:01 |
|   5 |    TABLE ACCESS FULL                 | TABLE2            |     5 |   800  |    18   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------


3. /* USE_HASH(TABLE1, TABLE2) */
Plan hash value: 2744198516
------------------------------------------------------------------------------
| Id  | Operation                  | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |            |     5 |  1470 |    22   (5)| 00:00:01 |
|*  1 |  HASH JOIN               |            |     5 |  1470 |    22   (5)| 00:00:01 |
|   2 |   TABLE ACCESS FULL  | TABLE1  |     4 |   536  |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL  | TABLE2  |     5 |   800  |    18   (0)| 00:00:01 |
------------------------------------------------------------------------------

by 마농 [2019.05.29 17:22:02]

기본적으로는 비용이 낮은게 당연히 좋겠지만...
비용 계산이 정확하리라는 보장은 없죠.
조건이 있냐 없냐? 조인 방향을 어떻게 할 것인지?
건수가 얼마나 되는지? 인덱스가 적절한지 등등 고려할게 많습니다.

테스트 데이터 건수가 너무 적어 판단이 불가능하네요.
조건 없는 대용량 조인은 해시가 유리하고
인덱스가 없는 경우에도 해시가 유리하고
조건으로 일부만 발췌하는 쿼리의 경우 NL 이 유리하죠.


by 가람대디 [2019.05.29 17:41:11]

답변감사합니다.

말씀하신 내용은 이해했습니다.

제가 궁금했던점은 실제로 플랜 내용만 가지고 판단할순 없겠지만

단순 위 플랜 내용만 보았을때 1번 NL조인일 경우 5초, 3번 HASH조인의 경우 4초

비용은 1번 NL조인이 적게발생하고 3번 HASH조인이 많이 발생하는것 같은데

어떤게 좋다고 볼수있것인지 그 기준이 궁금했습니다. ㅠㅠ


by 마농 [2019.05.29 18:03:34]

초는 다 합치는게 아니고 누적되는 걸꺼에요. 1초
수치가 너무 적어 비교 불가요.


by 가람대디 [2019.05.30 11:07:10]

초가 누적이라고 말씀해주셔서 데이터 좀 많은 테이블로 테스트해봤는데

이해가 잘안되네요ㅜㅜ4초가 누적인가요? 1초 나온건 무엇인지 궁금하네요

Plan hash value: 3508590408
 
---------------------------------------------------------------------------------------------
| Id  | Operation                                | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |              | 68434 |    10M|   317   (2)| 00:00:04 |
|*  1 |  HASH JOIN RIGHT OUTER         |              | 68434 |    10M|   317   (2)| 00:00:04 |
|   2 |   TABLE ACCESS BY INDEX ROWID| CMCODE       |     7 |   385 |     5   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN              | CMCODE_IDX01 |     7 |       |     2   (0)| 00:00:01 |
|   4 |   TABLE ACCESS FULL               | CMPOST       | 68434 |  6616K|   312   (2)| 00:00:04 |
---------------------------------------------------------------------------------------------


by 마농 [2019.05.30 11:17:31]

선행 인덱스 읽고 테이블 읽는데 1초
후행 테이블 읽어 조인하는 데 4초
그래서 총 4초 걸리는 거죠.

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