반응형

본 포스트의 내용은 MS SQL Server2005 이상에 국한된 내용입니다.

퍼가실 때는 덧글을 달아주시는 센스를...

 

텍스트 실행 계획 사용하기

 

그래픽 실행 계획은 가독성이 좋기 때문에 매우 유용하다. 그러나 실행 계획에 대한 많은 정보를 한 번에 볼 수 없다는 단점이 있다. 어떤 정보는 ToolTip에서만 보여지고, 또 어떤 정보는 그래픽 실행 계획의 노드 속성에서만 확인 할 수 있다. 만일 이 모든 정보를 한 번에 볼 수 있는 방법이 있으면 얼마나 좋을까?

놀랄만큼 복잡한 실행 계획을 가진 쿼리라든지 수십 개의 쿼리를 내포하고 있는 배치의 경우, "Table scan을 하고 있지는 않을까?" 혹은 "가장 비용을 많이 차지하고 있는 쿼리는 무엇일까?" 등 찾아 내기는 그리 쉽지만은 않을 것이다.

이에 그 대안으로 텍스트 실행 계획XML 실행 계획을 소개하고자 한다.

 

이 중에서 텍스트 실행 계획을 먼저 살펴보겠다.

※ 마이크로소프트는 2008 이후 버전부터 텍스트 실행 계획을 기능에서 제거할 예정이다. 따라서 여기서는 그리 비중있게 다루지는 않겠다.

 

 

 

예상 실행 계획 표시하기

 

텍스트 형식으로 예상 실행 계획을  표시하는 방법은 아주 간단하다. 그냥 실행할 쿼리 앞에 아래의 SET문을 실행하기만 하면 된다.

참고로 BOL에서는 이런류의 SET문을 실행 계획 SET 옵션이라고 부르고 있다.

 

SET SHOWPLAN_ALL ON;

 

여기서 한 가지 중요한 사실을 기억하기 바란다. 한 번 SHOWPLAN_ALL 옵션을 ON으로 설정하면, 이하 실행되는 모든 T-SQL문의 실행 정보를 취득할 수 할 수 있다. 하지만, 이 때 '실제로 구문이 실행되는 것은 아니다'. 따라서, 필요한 실행 계획 정보를 취득한 다음에는 반드시 이 옵션을 OFF 해줘야 한다.  SHOWPLAN_ALL 옵션을 ON 으로 설정했다는 것을 잊어버렸다가는 큰 낭패를 당할 것이다.

"난 분명히 테이블을 작성했는데 테이블이 없다" 라든지, "중요한 고객 정보가 갱신되지 않았습니다" 라든지 말이다.

 

SHOWPLAN_ALL 옵션을 끄는 방법

SET SHOWPLAN_ALL OFF;

 

SHOWPLAN_ALL 이외에 SHOWPLAN_TEXT라는 옵션도 있다. 이는 osql.exe와 같은 툴에서 간단하게 실행 계획 정보를 조회할 때 유용하다. 이 또한 SHOWPLAN_ALL 옵션과 마찬가지로 실제로 구문이 실행되지 않으므로 주의하기 바란다.

 

 

 

실질 실행 계획 표시하기

 

텍스트 형식으로 실질 실행 계획을 취득하기 하기 위해서는 아래의 SET문을 실행하면 된다.

 

SET STATISTICS PROFILE ON;

 

반대로 비활성화하기 위해서는 아래의 SET문을 실행하면 된다. 

SET STATISTICS PROFILE OFF;

 

 

 

텍스트 실행 계획 해석하기

 

이해를 돕기 위해 실행 계획 기초(3) 그래픽 실행 계획 사용하기 에서 사용했던 T-SQL문을 아래와 같이 실행해보자 .

 

SET SHOWPLAN_ALL ON;

GO

 

SELECT *
FROM [dbo].[DatabaseLog];

 

위 구문을 실행하면 결과창에 아래와 같이 예상 실행 계획이 표시될 것이다. 

오라클 유저라면 마치 오라클의 그것과 모습이 유사하다는 것을 느낄 수 있을 것이다.

 


[그림 1] 텍스트 실행 계획 - SHOWPLAN_ALL 

 

텍스트 실행 계획은 그래픽 실행 계획을 옆으로 뉘인 형태라고 생각하면 된다. 첫 번째 행에는 우리가 실행한 구문이 보여지고 있다. 그리고 그 밑으로 어떠한 과정으로 해당 구문을 실행할지 Physical Opreator(이하 물리 연산자) 들이 표시된다. 여기서는 Table Scan을 하고 있다.

 

앞으로 이야기를 진행하면서 우리는 좀 더 복잡한 실행 계획을 다루게 될 것인데,  앞에서 언급했듯이 텍스트 실행 계획이 그래픽 실행 계획에 비해 가독성이 떨어진다는 사실을 점차 느낄 수 있을 것이다. 하지만 오라클 유저라면 어쩌면 텍스트 실행 계획이 더 편할 수도...

각설하고, 텍스트 실행 계획을 읽는 방법은 그래픽 실행 계획을 읽는 방법과 조금 다르다. 그래픽 실행 계획을 읽는 순서는  "오른쪽에서 왼쪽으로, 위에서 아래로" 이지만, 텍스트 실행 계획은 "안쪽에서 바깥쪽으로, 위에서 아래로" 읽어야 한다. 각 노드의 부모 자식 관계를 연결하는 파이프라인 ( | )을 이용하면 읽기에 용이할 것이다.

 

첫 번째 컬럼에는 앞서 실행 계획 기초(3) 그래픽 실행 계획 사용하기 에서 살펴보았던 ToolTip이나 그래픽 실행 계획 노드 속성 창의 내용이 표시된다. 아마 여러분이 확인하고자 하는 대부분의 내용이 이 컬럼에 나타날 것이다. 그래픽 실행 계획에서 NodeId는 해당 노드의 고유한 속성이기 때문에 유용하지만, 해당 노드의 부모노드(Parent)의 정보는 화살표의 방향으로도 확인할 수 있으므로 표시되지 않았다. 하지만, SHOWPLAN_ALL에서는  Parent NodeId 정보도 확인할 수 있다. 결과 창을 오른쪽으로 스크롤하면 TotalSubTreeCost, EstimasteRows 등 우리에게 이미 친숙한(? ^^;) 내용들을 확인할 수 있을 것이다. 또한 콤마구분자로 리스트된 Defined Values와 같은 생소한 컬럼도 확인할 수 있을 것이다. Defined Values란 해당 연산으로 인해 결과치나 컬럼의 데이터 스트림이다.

 

 

 

다음 이야기 : 5. 실행 계획 기초 - XML 실행 계획 사용하기

반응형

+ Recent posts