반응형

XML 실행 계획 사용하기

 

XML 실행 계획은 SQL Server 2005 부터 새롭게 제공되고 있는 실행 계획 표시 방법이다.

 

 

 

예상 실행 계획과 실질 실행 계획 표시하기

 

XML 형식의 예상 실행 계획 보기를 활성화 또는 비활성화하기 위해서는 아래의 옵션을 사용한다.

 

SET SHOWPLAN_XML ON;

...

SET SHOWPLAN_XML OFF

 

SHOWPLAN_XML 명령어는 SHOWPLAN_ALL과 마찬가지로 T-SQL문을 실행하지 않는다. 단지 실행 계획을 XML 문서형식으로 보여주는 것 이외에는 기본적으로 SHOWPLAN_ALL과 같다고 생각해도 무방하다. 그리고, 재차 강조하는 내용이지만 실행 계획을 수집했으면 이 옵션을 OFF하는 것을 잊지 말아야 할 것이다.

 

XML 형식의 실질 실행 계획 보기를 활성화 또는 비활성화하기 위해서는 아래의 옵션을 사용한다.

 

SET STATISTICS XML ON;
...
SET STATISTICS XML OFF;

 

 

 

 

XML 실행 계획 해석하기

 

마찬가지로, 이해를 돕기 위해 실행 계획 기초(4) 텍스트 실행 계획 사용하기 에서 사용한 쿼리를 다시 실행해 보도록 하겠다.

 

SET SHOWPLAN_XML ON;

GO

 

SELECT *
FROM [dbo].[DatabaseLog];

 

실행 결과는 아래와 같은 모습으로 결과창에 표시될 것이다.

참고로 결과는 텍스트 형식이나 표 형식으로 표시하거나, 파일로도 저장할 수 있다. 결과 형식을 바꾸기 위해서는 메뉴 > 쿼리(Query) > 결과 표시(Result To) 에서 원하는 결과 표시 형식을 선택하면 된다. SQL 편집기 도구 모음에서 해당 아이콘을 클릭해도 된다. 혹은, 단축키 CTRL + T(결과를 텍스트로 표시), CTRL + D(결과를 표 형식으로 표시), CTRL + SHIFT + F(결과를 파일로 출력)를 사용해도 된다.

 


[그림 1] XML 실행 계획 - SHOWPLAN_XML  

 

결과 창의 하이퍼링크는 아래의 경로에 위치한 XML 스키마 정의 파일을 가리킨다.

 

\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2003\03\showplan\showplanxml.xsd

 

자! 하이퍼링크를 클릭해 보자. SQL Server Management Studio(이하 SSMS)의 브라우저 창에 XML 형식의 실행 계획이 표시될 것이다. 우리가 질의한 T-SQL문은 아주 단순하지만 상당히 많은 양의 정보가 보여짐을 느낄 수 있을 것이다. 참고로, XML의 각각의 element(요소)와 attribute(속성)의 풀셋은 아래에서도 확인 가능하다.

 

http://schemas.microsoft.com/sqlserver/2004/07/showplan/.

 

실행 계획의 내용을 위에서 부터 차근차근 살펴보도록 하자.

가장 먼저 보이는 것은  BatchSequence, Batch 그리고, Statement element이다. 예제의 경우 single Batch, single Statement이므로 이 element는 반복해서 나타나지 않고 한 번만 나타났다. 다음으로 보여지는 것은 StmtSimple element이다. 이 element에서는 우리가 질의한 쿼리를 볼 수 있으며, statement의 속성들과 Query Plan의 몇가지 물리적인 속성도 함께 확인할 수 있다.

 

<BatchSequence>
    <Batch>
        <Statements>
            <StmtSimple StatementText="&#xD;&#xA; &#xD;&#xA;&#xD;&#xA;SELECT *&#xD;&#xA;FROM [dbo].[DatabaseLog];

                &#xD;&#xA;" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.108154"

                StatementEstRows="389" StatementOptmLevel="TRIVIAL">
                  <StatementSetOptions QUOTED_IDENTIFIER="false" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="false"

                    ANSI_NULLS="false" ANSI_PADDING="false" ANSI_WARNINGS="false" NUMERIC_ROUNDABORT="false" />
                       <QueryPlan CachedPlanSize="9">

 

쿼리 옵티마이저는 예상대로 trivial plan을 선택했다. 이는 StatementOptmLevel 속성에서 확인할 수 있다. CachedPlanSize와 같은 속성 정보는 아주 유용하다. 예를 들어 쿼리가 한 페이지를 초과하여 LeaveBehind 메모리 영역으로 보내어 졌는지 측정하는데 큰 도움이 된다.

 

다음으로 보이는 것은 RelOp element이다. 여기서는 해당 구문을 위해 어떤 물리적 연산(PhysicalOp)과 논리적 연산(LogicalOp)을 할 것인지, 그리고 예상 행 수(EstimateRows), 예상 CPU(EstimateCPU) 처럼 이미 우리가 살펴 본 친숙한 내용들을 확인할 수 있다.

 

                           <RelOp NodeId="0" PhysicalOp="Table Scan" LogicalOp="Table Scan" EstimateRows="389"

                             EstimateIO="0.107569" EstimateCPU="0.0005849" AvgRowSize="8569"

                             EstimatedTotalSubtreeCost="0.108154" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">

 

XML 실행 계획은 다른 실행 계획 보기들보다 더 많은 정보를 제공할 뿐만 아니라 가독성도 좋다. 예를 들어, OutputList element의 리스트 정보의 ColumnReference element경우 다른 실행 계획 보기들 보다 훨씬 보기가 편하다는 것을 느낄 수 있을 것이다.

 

                              <OutputList>
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="DatabaseLogID" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="PostTime" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="DatabaseUser" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="Event" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="Schema" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="Object" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="TSQL" />
                                 <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                   Column="XmlEvent" />
                              </OutputList>

 

그 밑으로 TableScan element가 있다. 이 element의 속성에 대해서는 이미 앞에서 살펴본 바가 있으므로 설명을 생략하겠다.

 

<TableScan Ordered="0" ForcedIndex="0" NoExpandHint="0">

 

이어지는 리스트들은 컬럼의 레이아웃을 정의한 값들로 연산에 의해 참조된다.

 

                              <DefinedValues>
                                  <DefinedValue>
                                       <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                         Column="DatabaseLogID" />
                                  </DefinedValue>
..................< output cropped > ...............................
                                  <DefinedValue>

                                       <ColumnReference Database="[AdventureWorks]" Schema="[dbo]" Table="[DatabaseLog]"

                                         Column="XmlEvent" />
                                  </DefinedValue>
                             </DefinedValues>

..................< output cropped > ...............................

 

 

 

 

XML 실행 계획을 그래픽 실행 계획으로 저장하기

 

결과 창에서 실행 계획을 포함하는 Microsoft SQL Server XML Showplan을 마우스 오른쪽 버튼으로 클릭한 다음 다른 이름으로 결과 저장(Save As) 을 클릭한다. 그런 다음 <표 형태 또는 텍스트> 결과 저장 대화 상자의 파일 형식에서 모든 파일(*.*)을 클릭한다. 그리고 파일 이름 입력란에 <이름>.sqlplan 형식으로 이름을 입력하고 저장 버튼을 클릭하여 파일을 저장한다. 이렇게 저장된 실행 계획은 파일 열기로 그래픽 실행 계획 형태로 볼 수 있다.

 

이 방법은 상당히 유용하다. 예를 들어 XML 형식으로 몇 개의 실행 계획을 작성하고 각각 파일로 저장한 다음 이 파일을 열어 그래픽 형식으로 비교 분석할 수 있다. 또는 문제가 되는 쿼리라든지 성능이 나쁜 쿼리을 이 방법으로 저장해 두었다가, 개발자라면 DBA에게 해당 파일을 공유하여 조언을 구할 수도 있고, DBA라면 개발자에게 파일을 제시하여 쿼리 수정을 권고할 수 있을 것이다.

 

만일, XML 형식으로 XML 실행 계획을 저장하고자 한다면, 먼저 결과를 XML 창에 표시한 후 CTRL + S 단축키를 눌러 XML로 파일을 저장하면 된다. 만일 결과 창에서 XML를 직접 저장하면 단지 결과 창에 무엇이 표시되었는지만 저장된다. 

 

 

 

다음 이야기 : 6. 실행 계획 기초 - SQL Server Profiler로 실행 계획 캡처하기

 

반응형

+ Recent posts