BACKEND/MSSQL

MSSQL :: SET STATISITCS

neeon 2024. 1. 5. 16:19
728x90

 

쿼리를 짜다보면 쿼리 성능 분석이 필요한 케이스가 생긴다.

 

그때 사용하는 것이 SET STATISTICS.

관련된 셋팅에 대해 알아보도록 하겠다.

 

 

실행 통계 정보와 관련된 IO

 

SET STATISTICS IO ON
SET STATISTICS IO OFF

 

Statistics 의 IO 옵션을 켜면 통계 정보가 표시된다.

 

 

이런 식으로 message 창에서 확인이 가능하다.

 

확인할 수 있는 정보

Table 테이블 정보
Scan Count 실행된 검색 수
Logical Reads 리적 읽기 수. 데이터 캐시에서 읽은 페이지 수.
Physical Reads 물리적 읽기 수. 디스크에서 읽은 페이지 수.
Read-ahead Reads 미리 읽기 수. 쿼리에 대해 캐시에 넣어진 페이지 수
LOB Logical Reads LOB 논리적 읽기 수.
데이터 캐시에서 읽은 text, ntext, image 또는 큰 값 유형(varchar(max), nvarchar(max), varbinary(max)의 페이지 수.
LOB Physical Reads LOB 물리적 읽기 수.
디스크에서 읽은 text, ntext, image 또는 큰 값 유형의 페이지 수
LOB Read-ahead Reads LOB 미리 읽기 수.
쿼리에 대해 캐시에 넣어진 text, ntext, image 또는 큰 값 유형의 페이지 수.

 

 

시간 통계 정보와 관련된 TIME

 

SET STATISTICS TIME ON
SET STATISTICS TIME OFF

 

statistics의 time 옵션을 켜면 시간 통계와 관련된 정보가 표시 된다.

 

 

위와 같이 Messages 창에서 확인이 가능하다.

 

확인할 수 있는 정보

CPU time CPU 시간
elapsed time 결과 시간

 

 

처리 과정 정보와 관련된 Profile

 

SET STATISTICS TIME ON;
SET STATISTICS TIME OFF;

 

statistics의 profile 옵션을 켜면 쿼리의 처리 과정에 대한 정보가 표시 된다.

 

 

위의 결과 값 과 함께 아래에 테이블 형태로 제공된다.

 

확인할 수 있는 정보

Rows 각 연산자에서 만든 실제의 행 수.
오라클의 A-Row 와 같은 개념
Executes 각 연산자가 몇 번 실행이 되었는지에 대한 정보
StmtText * Statement Text
세부적으로 어떤 실행이 있었는지를 보여주거나 (Plan_Row)
실제로 실행된 쿼리를 보여줌 (Plan_Row가 아닌 행)

각 연산자에서 물리적(Nested Loops), 논리적(Inner Join)으로 어떤 동작이 있었는지를 볼 수 있음.
StmtId 일괄처리에 있는 문의 개수.

여러개의 쿼리가 실행되었을 경우 나중에 실행된 쿼리일수록 숫자가 높음.
NodeId 현재 쿼리의 Node Id.
Parent 현재 실행계획의 부모 단계 Node Id.
PhysicalOp 실제 물리적으로 어떤 구현이 있었는지에 대한 설명
Plan_Row에서만 제공.
LogicalOp 논리적(관계형)으로 어떤 연산이 있었는지에 대한 설명
Plan_Row에서만 제공
Argument 수행되는 작업의 추가 정보를 제공(인수)

TOP 절의 행 수, Group by 조건, Where 조건, Index Seek, Scan 사항 등이 이에 포함
DefinedVales 해당 연산자가 사용하는 값에 대한 목록
현재 쿼리에 있는 '계산 식' 이나 쿼리 처리를 위해 사용한 쿼리프로세서 '내부 값'을 의미
EstimateRows 현재 연산자가 생성한 출력의 예상 행 수
EstimateIO 현재 연산자 작업에 대한 예상 IO 비용
EstimateCPU 현재 연산자 작업에 대한 예상 CPU 비용
AvgRowSize 현재 연산자를 통해 통과되는 행의 예상 크기(byte)
TotalSubtressCost 현재 작업과 하위 연산자를 통한 작업 비용의 예상 누적 비용
OutputList 현재 연산자를 통해 어떤 열들이 산출되는 지에 대한 정보
Warnings 현재 작업과 관련된 경고 메세지 목록
Type 현재 연산 Node가 어떤 유형의 작업인지에 대한 정보

Plan_Row에 대한 구분은 이 열을 통해 가능함.
Parallel 연산이 병렬로 실행되었는지 아닌지에 대한 정보

0은 비 병렬처리. 1은 병렬처리.
EstimateExecutions 현재 쿼리 실행 동안 해당 연산자가 실행될 예상 횟수

 

 


 

실행계획들을 보면서

적당하게 쿼리 튜닝을 진행하는 것도 하나의 능력.

 

 

 

728x90