Full table scan 실행계획 buffer 차이 질문 0 0 2,020

by 티라미수꿀맛 [SQL Query] [2023.08.31 22:06:37]


안녕하세요

막히는 부분이 있어 고수님들께 도움을 받아보고자 글을 올리게 됐습니다.


select * from test.emp where deptno in ( select deptno from test.dept_n) ; -- query 1

select count(*) from test.emp where deptno in ( select deptno from test.dept_n); -- query 2 

select * from test.emp where deptno in ( select deptno from test.dept_n) order by 1; -- query 3

-- query 1
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
select * from test.emp where deptno in ( select deptno from test.dept_n)

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |         |      1 |   |  14000 |00:00:00.02 |    1029 |   |   |      |
|*  1 |  HASH JOIN RIGHT SEMI|         |      1 |  14000 |  14000 |00:00:00.02 |    1029 |  2440K|  2440K| 1158K (0)|
|   2 |   TABLE ACCESS FULL  | DEPT_N |      1 |      4 |      4 |00:00:00.01 |       2 |   |   |      |
|   3 |   TABLE ACCESS FULL  | EMP |      1 |  14000 |  14000 |00:00:00.01 |    1027 |   |   |      |
--------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("DEPTNO"="DEPTNO")

-- query 2
PLAN_TABLE_OUTPUT
-------------------------------------
select count(*) from test.emp where deptno in ( select deptno from test.dept_n)

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |      1 |    |   1 |00:00:00.01 |      96 |    |    |       |
|   1 |  SORT AGGREGATE       |        |      1 |      1 |   1 |00:00:00.01 |      96 |    |    |       |
|*  2 |   HASH JOIN RIGHT SEMI|        |      1 |  14000 |  14000 |00:00:00.01 |      96 |  2440K|  2440K| 1008K (0)|
|   3 |    TABLE ACCESS FULL  | DEPT_N |      1 |      4 |   4 |00:00:00.01 |       2 |    |    |       |
|   4 |    TABLE ACCESS FULL  | EMP |      1 |  14000 |  14000 |00:00:00.01 |      94 |    |    |       |
---------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("DEPTNO"="DEPTNO")

 

-- query 3
PLAN_TABLE_OUTPUT
-------------------------------------
select * from test.emp where deptno in ( select deptno from test.dept_n) order by 1

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation         | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |      1 |    |  14000 |00:00:00.03 |      96 |    |    |       |
|   1 |  SORT ORDER BY         |        |      1 |  14000 |  14000 |00:00:00.03 |      96 |  1116K|   557K|  991K (0)|
|*  2 |   HASH JOIN RIGHT SEMI|        |      1 |  14000 |  14000 |00:00:00.01 |      96 |  2440K|  2440K|  994K (0)|
|   3 |    TABLE ACCESS FULL  | DEPT_N |      1 |      4 |   4 |00:00:00.01 |       2 |    |    |       |
|   4 |    TABLE ACCESS FULL  | EMP |      1 |  14000 |  14000 |00:00:00.01 |      94 |    |    |       |
---------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("DEPTNO"="DEPTNO")

 

3개 쿼리 전부 DEPT_N TABLE을 선행으로 해시 테이블 생성

 이후 , EMP를 후행 테이블로 조인을 하는건 이해를 하였습니다.

 궁극적으로 궁금한것은 노란색을 칠한  Memory 부분과 Buffer 부분입니다.

참고로 , 해당 테이블들은 인덱스가 없습니다.

 

1) 1번과 2번 쿼리는 emp table에 대해 select * , select count(*) 으로

컬럼의 개수가 달라 가져오는 버퍼수와 hash join right semi의 메모리 사용량이 다른게 맞을까요?

 

2) 1번이 맞다면, 

왜 , 1번과 3번 쿼리는 전부 같으면서 마지막에만 order by를 하냐 안하냐 차이인데

실행 계획을보면 order by 하기 전 1번은 buffer - 1027 3번은 - 94 입니다. 

또한 , hash join 때 사용되는 메모리도 3번이 훨씬 적구요 . 

왜 이런 차이가 일어나는지 궁금합니다.

 

 

글이 두서 없이 작성하여 보기 불편하실거 알지만 양해 부탁 드리며

고수님들의 의견 많이 주셨으면 좋겠습니다.

 

감사합니다.

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