실행계획(gather_plan_statistics) 문의 드립니다. 0 4 1,807

by 제로 [2015.11.10 15:28:14]


안녕하세요. gather_plan_statistics 힌트절 삽입후 출력되는 실행계획에 대해 문의 드립니다.


아래 2개의 쿼리문의 실행계획중 메모리 사용량에 대한 문의 입니다.

두개의 쿼리가 중 다른 부분은 1번은 group by 이고 2번은 group by, order by 구문이 있습니다.

실행계획에서 보면 1번 쿼리에 대한 메모리 사용량이 높은데... 그 이유가 궁금합니다.

오라클 버젼은 11.2.0.1 입니다.




1)번 쿼리

select /*+ gather_plan_statistics */ DNAME, LOC
from DEPT
group by DNAME, LOC ;

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | Cost (%CPU)| A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |    19 (100)|      4 |00:00:00.01 |      21 |       |       |          |
|   1 |  HASH GROUP BY     |      |      1 |    19   (6)|      4 |00:00:00.01 |      21 |  1012K|  1012K|  725K (0)|
|   2 |   TABLE ACCESS FULL| DEPT |      1 |    18   (0)|      4 |00:00:00.01 |      21 |       |       |          |
--------------------------------------------------------------------------------------------------------------------




2)번 쿼리

select /*+ gather_plan_statistics */ DNAME, LOC
from DEPT
group by DNAME, LOC
order by DNAME, LOC;

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | Cost (%CPU)| A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |    19 (100)|      4 |00:00:00.01 |      21 |       |       |          |
|   1 |  SORT GROUP BY     |      |      1 |    19   (6)|      4 |00:00:00.01 |      21 |  2048 |  2048 | 2048  (0)|
|   2 |   TABLE ACCESS FULL| DEPT |      1 |    18   (0)|      4 |00:00:00.01 |      21 |       |       |          |
--------------------------------------------------------------------------------------------------------------------

 

by 비니 [2015.11.10 16:17:59]

위 쿼리가 1번하시고 곧이어서 2번을 하신건가요? 

제가 보기엔 1번 했을때 이미 full access가 발생했고,   그 뒤에 같은 테이블의 같은 컬럼으로 그룹바이를 실행했으므로

이미 1번에서 행해진 정보가 오라클 shared pool 에 남아 있을거에요.   그렇기때문에 2번에서 소프트파싱이 일어나서 

2번이 메모리를 적게 사용한것으로 추정 됩니다. 

alter system flush shared_pool;  1번 쿼리 실행 후  이 쿼리를 실행해서 shared pool 초기화 시킨후 2번 쿼리를 해보세요. 


by 제로 [2015.11.10 16:26:55]

alter system flush shared_pool; alter system flush buffer_pool; 해도 위와 같이 메모리가 출력되더라구요... 1,2번 순서를 바꿔서 해도 동일하네요...


by 마농 [2015.11.11 14:42:35]

사용된 메모리 크기를 나타내는 것인가요?
이거 외에 다른 항목은 모두 동일하네요.
딱히 이 팩터만 가지고 Sort 가 Hash 보다 성능이 좋다라고 얘기하기는 곤란할 듯 하네요.
Hash 가 더 많은 메모리를 사용한 것은 해시키값이 함게 저장되기 때문일 듯 하네요.
정렬이 많은 비용을 차지한다고 하죠.
그래서 그룹바이 방식을 해시로 바꾼거구요.
정렬동작에대한 비용과 해시처리동작에 대한 비용이 정확하게 표현되지 않는 듯 하네요.
메모리 사용만 봐서 판단할 것은 아닌듯 합니다.
사용하신 샘플이 워낙 크기가 작아서 정확한 비교가 안되네요.
대용량 샘플로 테스트해보세요.


by 제로 [2015.11.11 19:47:40]

아~ 우선 답변 감사합니다.

위 내용 관련해서 좀 더 테스트(고민) 해보도록 하겠습니다.

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