BLOG main image
분류 전체보기 (45)
SQL Server 이야기 (45)
일상 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2009. 2. 3. 21:44

현재 운영중인 서버에서 쿼리별 컴파일에 사용된 리소스 및 시간을 알 수 있는 방법은 SET STATISTICS TIME 옵션과 XML 플랜이 있습니다.

위 방법을 가지고 하나씩 관련 정보를 가져오기 위해서는 꽤 긴 시간이 필요 할 수도 있습니다.


보다 쉬운 방법으로는 DMV를 이용하는 것입니다.
SQL Server 2005
이상에서는 DMV를 통해 XML 플랜을 제공해주고 있습니다.

XML 플랜을 XQUERY로 표 형태로 처리한다면 보다 쉽게 컴파일에 리소스 사용에 대해 확인 할 수 있습니다.

 

[XML 실행계획]

<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.0.1779.0">

  <BatchSequence>

    <Batch>

      <Statements>

        <StmtSimple StatementText=" " StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="7.2111" StatementEstRows="100" StatementOptmLevel="FULL" QueryHash="0x3CFB83F9F6D5CA9A" QueryPlanHash="0x2A53000B8E4C7D2E">

          <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />

          <QueryPlan CachedPlanSize="80" CompileTime="53" CompileCPU="53" CompileMemory="1400">

 

 


쿼리 플랜에서 몇가지 속성값에 대해 간단히 정리해 보면

     -       CachedPlanSize :  쿼리 플랜이 크기
    
-       CompileTime : 쿼리가 컴파일 할 때 소요된 시간 (SQL Server 2005 SP2 추가)

-       CompileCPU: : 쿼리가 컴파일 할 때 사용한 CPU 시간 (SQL Server 2005 SP2 추가)

-       CompileMemory : 쿼리가 컴파일 할 때 사용한 메모리 크기(SQL Server 2005 SP2 추가)


 

아래의 DMV를 통해 확인 할 수 있습니다.


with
XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sql)

SELECT TOP 10

 db_name,sp_name,sp_text,[statement_text]

 ,[query_plan],[CompileTime(ms)],[CachedPlanSize(kb)],[CompileCPU(ms) ],[CompileMemory(kb)]

 FROM

  (

   SELECT

    db_name(qt.dbid) AS 'db_name'

    ,qt.text AS 'sp_text'

    , substring(qt.text, (qs.statement_start_offset/2)+1

           , ((case qs.statement_end_offset

              when -1 then datalength(qt.text)

              else qs.statement_end_offset

              end - qs.statement_start_offset)/2) + 1) as statement_text

    , cast(qp.query_plan as xml) as query_plan

    ,OBJECT_NAME(qp.objectid,qp.dbid) as sp_name

   FROM sys.dm_exec_query_stats AS qs

    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt

    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle,qs.statement_start_offset,qs.statement_end_offset) qp

  )X

OUTER APPLY

 (

 SELECT

  c.value('(./@CompileTime)[1]','INT') AS "CompileTime(ms)"

  ,c.value('(./@CachedPlanSize)[1]','INT') AS "CachedPlanSize(kb)"

  ,c.value('(./@CompileCPU)[1]','INT') AS "CompileCPU(ms) "

  ,c.value('(./@CompileMemory)[1]','INT') AS "CompileMemory(kb)"

 FROM query_plan.nodes('//sql:QueryPlan')B(C)

 )xp


[
결과]


송 혁, SQL Server MVP
sqler.pe.kr // sqlleader.com
hyoksong.tistory.com