안녕하세요 ^^.
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 : 현재 쿼리의 실행 동안 해당 행의 연산자가 실행 될
예상 횟수 입니다.
===================================================
서두에 말씀 드린 것 처럼...
혹시 틀린것이 있거나, 제가 잘못 해석한것이 있다면, 댓글로 남겨주시면, 시정하고, 수정내역 남기도록 하겠습니다 ^^.
이 글을 읽어주신 모든분께.. 감사드립니다 ^^~!
'MS SQL Server > Optimizing' 카테고리의 다른 글
sp_ 프리픽스 SQL Server 2012 (0) | 2014.09.02 |
---|---|
아무리 성능이 좋은 ssd로 바꿔도 writelog I/O 병목이 사라지지 않는 경우 (0) | 2014.08.20 |
실행 계획에서 볼 수 있는 연산자(Operator) 정리 Vol. 1 (0) | 2012.06.04 |