본문 바로가기

MS SQL Server/Optimizing

SET Statistics Profile On 에 의한 각 열(Column)의 의미

안녕하세요 ^^.

Daily-SQL 블로그의 차태욱입니다.

SET Statistics Profile On 에 의한 각 열(Column)의 의미에 대해 공부한 부분 간단히 공유하고싶어 몇자 적게 되었습니다 ^^.

혹시 틀린것이 있거나, 제가 잘못 해석한것이 있다면, 댓글로 남겨주시면, 시정하고, 수정내역 남기도록 하겠습니다 ^^.

===================================================

SET Statistics Profile On 에 의한 각 열(Column)의 의미
(http://msdn.microsoft.com/ko-kr/library/ms187735(v=sql.90).aspx)

우리는 실행되었던 쿼리에 대한 처리 과정을 보고 싶을 때, 몇가지 방법을 사용하고,
그 중 [그래픽 실행계획] 과 [SET STATICS PROFILE ON] 옵션 그리고 [XML 실행계획]
Profiler 를 통한 성능 분석을 하기 전에 가장 많이 사용하는 방법이 아닐까 생각합니다.

오늘은 그 중 표 혹은 텍스트의 형태로 결과를 보여주며, 쿼리가 어떻게 실행되었는지, 어떠한 과정들이 있었는지, 직관적으로 볼 수 있는 SET STATICS PROFILE ON 옵션에 대해 살펴보고자 합니다.

1.    Rows    : 각 연산자에서 만든 실제의 행 수를 보여줍니다.

A.     실제 행수 - SQL서버의 각 Operator(연산자) 에서 연산작업을 할 때 실제로
           
몇 개의 행을 가지고 실행 하였는지 보여줍니다.

2.    Executes : 각 연산자가 몇 번 실행이 되었는지 보여줍니다

A.     다음은 58개의 행에 해당하는 Where 조건에 충족하는 58개의 위치를 찾기 위해,
58
개의 Index Seek이 있었음을 보여주는 그래픽실행계획 상세정보


.

3.    StmtText           : 세부적으로 어떤 실행이 있었는지를 보여주거나,(Plan_Row)
            
실제로 실행된 쿼리를 보여줍니다.(Plan_Row가 아닌 행
)
            
각 연산자에서 물리적(Nested Loops),논리적(Inner Join)으로

            
어떠한 동작이 있었는지를 볼 수 있습니다.

A.     Stmt - Statement의 약자


4.    StmtId   : 쿼리가 실행 되었고, 여러 개의 쿼리가 실행되었을 때 나중에 실행된 쿼리
         
일수록 이 숫자가 높습니다.

A.     Books online 에서는 현재 일괄처리에 있는 문의 개수 입니다. 라고 하네요

B.      다음은 한번의 실행에서(Batch) 두개의 쿼리를 실행하고 얻은 실행계획에서 확인 한 StmtId 입니다.

 

5.    NodeId  : 현재 쿼리의 Node Id이고, 실행계획이 길어질수록 더 많은 숫자를 볼 수
            
있습니다.

A.     다음은 Statistics Profile 정보에서 표시하는 연산자에 대한 NodeId 입니다.


6.    Parent   : 현재 실행계획의 부모단계의 Node Id 입니다.
   

A.     NodeId 12 Clustered Index Scan 11 Compute Scalar의 자식 연산자 이므로,
Parent
11

B.      NodeId 11 Compute Scalar 10 Filter 의 자식 연산자 이므로,
Parent
10

C.      NodeId 10 Filter 9 Nested Loops 의 자식 연산자 이므로,
Parent
9

 

7.    PhysicalOP : 실제 물리적으로 어떤 구현이 있었는지에 대한 설명입니다.
               Plan_Row
에서만 제공이 됩니다
.


 

8.    LogicalOP  : 논리적(관계형)으로 어떤 연산이 있었는지를 보여줍니다.
               7
번과 마찬가지로 Plan_Row에서만 제공이 됩니다.

A.     PhysicalOP LogicalOP가 다른 경우가 많은데, 대표적으로 Join이 있습니다.

B.      물리적으로 어떤 조인을 했는지(Nested Loops, Hash Match, Merge Join)와 논리적으로 어떤 조인을 했는지 (Inner, Outer, Anti, Semi)를 보여줍니다.

9.    Argument  : 수행되는 작업의 추가정보를 제공합니다.(인수)
               TOP
절의 행 수나, Group By 조건, Where 조건, Index Seek 혹은

              Scan
사항 등이 여기에 포함 됩니다.

A.     WHERE Idx=1 에 대해 master.dbo.tmp.idx의 조건으로 Table Scan을 한 것에
대한 상세 내용

 

10. DefinedValues : 해당 연산자가 사용하는 값에 대한 목록입니다.
                 
현재 쿼리에 있는 계산식이나 쿼리 처리를 위해 사용한 쿼리프로세서

                 
내부 값입니다.

A.    

11. EstimateRows : 이 연산자가 생성한 출력의 예상 행 수 입니다.

12. EstimateIO : 현재 연산자 작업에 대한 예상 IO비용 입니다.

 

13. EstimateCPU : 현재 연산자 작업에 대한 CPU비용 입니다.

14. AvgRowSize : 현재의 연산자를 통해 통과되는 행의 예상크기(바이트)입니다.

15. TotalSubtreeCost : 현재 작업과 하위 연산자를 통한 작업 비용의 예상 누적 비용입니다.

16. OutputList : 현재 연산자를 통해 어떠한 열 들이 산출 되어 지는지를 보여줍니다.

17. Warnings  : 현재 작업과 연관된 경고 메시지에 대한 목록을 보여줍니다.
           
대표적으로 CROSS JOIN 등을 하였을 때 일어나는

               NO JOIN PREDICATE
등이 있습니다.

18. Type     : 현재 연산 Node 가 어떤 유형의 작업 인지를 보여줍니다.
             PLAN_ROW
인지 PLAN_ROW가 아닌 행인지의 구분은 이 열을 통해

         
할 수 있습니다.

A.     

 

19. Parallel  : 연산이 병렬로 실행 되었는지, 아닌지를 bit값으로 보여줍니다.
            0
은 병렬처리가 되지 않았음, 1은 병렬처리가 되었음을 의미 합니다
.

20. EstimateExecutions : 현재 쿼리의 실행 동안 해당 행의 연산자가 실행 될
                        
예상 횟수 입니다.

===================================================

서두에 말씀 드린 것 처럼...
혹시 틀린것이 있거나, 제가 잘못 해석한것이 있다면, 댓글로 남겨주시면, 시정하고, 수정내역 남기도록 하겠습니다 ^^.

이 글을 읽어주신 모든분께.. 감사드립니다 ^^~!