카테고리 없음2023. 11. 10. 13:55

gather_plan_statistics의 힌트는 무엇인가?

 

 

Oracle DBMS 10g 부터 gather_plan_statistics 힌트를 이용하면 SQL trace를 수행하지 않고도 쿼리의 Plan 단계별로 row수, block의 개수, 사용되는 힌트 등의 SQL 통계정보를 확인할 수가 있게 되었다.

이에 쿼리 성능을 확인, 비교할 수 있기 때문에 SQL 튜닝 시에 아주 빈번하게 사용되는 유용한 힌트절이다.

 

 

사용방법)

 

 

1. 테스트 수행하는 Oracle DB의 버전은 19c 이다.

 

 

 

 

2. sample SQL의 실행

   SQL에 gather_plan_statistics(/*+ gather_plan_statistics */ )를 부여한다.

 

 

 

 

 

3. 수행한 SQL의 sql_id를 확인한다. jgh_01을 comment로 넣었으므로 이 값으로 like 검색하면 확인할 수 있다.

    조회한 sql_id는 985k8bddta87t 임을 확인할 수 있다.

 

 

 

 

4. 3에서 확인한 sql_id로 dbms_xplan.display_cursor로 SQL의 통계를 확인할 수 있다.

 

set lines 200

set pages 10000

위 옵션은 SQL*PLUS에서 한줄의 표현할 수 있는 라인의 갯수와 페이지의 크기를 지정할 수 있다.

 

 

dbms_xplan.display_cursor 수행시 아래와 같은 결과를 얻을 수 있다.

 

각 항목의 설명은 캡쳐된 화면 아래에서 확인할 수 있다.

 

 

 

 

Id, Operation, Name

 

 

이 부분은 SQL plan의 정보이다. 객체에 대한 Access 순서(driving)와 Access 방법(index scan, table scan, join의 순서)을 나타낸다. 참고로 Access 순서를 변경할 수 있는 힌트절은 ordered, leading 등이 있고 Access 방법을 변경할 수 있는 힌트절은 use_nl, use_hash, use_merge, index, full 등이 있다.

 

 

 

 

 

Starts

 

 

오퍼레이션을 수행한 횟수를 의미한다. Starts * E-Rows의 값이 A-Rows 값과 비슷하다면 통계정보의 예측 Row 수와 실제 실행 결과에 따른 실제 Row 수가 유사함을 알 수 있다. 만약 값에 큰 차이가 있다면 통계정보가 실제의 정보를 제대로 반영하지 못했다고 생각할 수 있다. 이로인해 오라클 DBMS의 옵티마이져가 잘못된 실행 계획을 수립할 수도 있으므로 이 때는 SQL의 튜닝이 필요하다.

 

 

 

 

 

 

 

E-Rows (Estimated Rows)

 

 

통계정보에 근거한 예측 Row 수를 의미한다. 통계정보를 갱신할수록 값이 매번 다를 수 있으며, 대부분의 DB 운영에서는 통계정보를 수시로 갱신하지 않으므로 해당 값에 큰 의미를 둘 필요는 없다. 하지만 E-Rows 값과 A-Rows 값이 현격하게 차이가 있다면 오라클이 잘못된 실행계획을 세울 수도 있음을 인지해야 하며 통계정보 생성을 검토해 보아야 한다.

 

 

 

 

 

A-Rows (Actual Rows)

 

 

쿼리 실행 결과에 따른 실제 수행 시간을 의미한다. 하지만 실행 시점의 여러 상황에 늘 가변적이고 또한 메모리에 올라온 Block의 수에 따라서 수행 시간이 달라지므로 해당 값에  큰 의미를 둘 필요는 없다.

 

 

 

 

 

Buffer (Logical Reads)

 

 

논리적인 Block의 수를 의미한다. 해당 값은 오라클 옵티마이저가 일한 총량을 의미하므로, 튜닝을 진행할 때 대부분의 튜너들이 가장 중요하게 생각하는 요소 중 하나이다.

 

 

 

 

 

Reads (Physical Reads)

 

 

물리적인 Get Block 수를 의미한다. 동일한 쿼리일 경우에는 값이 0인 것을 보면 알 수 있듯이 메모리에서 읽어 온 Block은 제외된다. 해당 값에 큰 의미를 둘 필요는 없다.

 

 

위의 항목들 중 튜닝 시에 가장 중요하게 생각되고 활용되는 값은 Buffers와 A-Rows이다. Buffers 값을 통해서 Get Block의 총량을 알 수 있고, A-Rows를 통해 실행 계획 단계별로 실제 Row 수를 알 수 있기 때문이다.

 

 

 

 

 

참고 사이트 : 

https://jmkjb.blogspot.com/2015/06/gatherplanstatistics.html

Posted by 자수성가한 부자