본문 바로가기
IT/MSSQL

[MSSQL] 예상 실행 계획 확인 & 상세설명

by 베베야 2021. 3. 17.
728x90

MSSQL에서 쿼리를 분석하기 위해서 실행계획을 보는 경우가 있습니다. 튜닝을 위함이죠.
오늘은 MSSQL 에서 내가 실행한 쿼리에 대한 여러 가지 정보를 분석해서 보여주는 "예상 실행계획" 확인하는 방법에 대해서 알아보겠습니다.

 

 

 

 

 

예상 실행계획 실행

1. SSMS에서 새 쿼리창을 활성화합니다.
2. 예상 실행계획을 보기위한 쿼리를 새창에 넣습니다.
3. SSMS 상단 메뉴바에서 "예상 실행 계획 표시"를 클릭하고 쿼리를 실행 또는 마우스 우클릭을 하고 "예상 실행 계획 표시"를 해도 되지만 단축키를 사용하겠습니다.
CTRL + L 키를 눌러서 내가 넣은 쿼리의 실행계획을 실행합니다.

 

예상 실행계획 분석

실행계획을 실행하면 화살표 모양으로 이루어진 계층 트리 그림들이 보입니다.
예상 실행 계획은 이전에 생성된 통계정보를 기준으로 보여주기 때문에 실제 실행했을 경우 오차가 있을 수 있습니다.


1. 실행 순서는 가장 우측 하단부터 시작해서 왼쪽 방향으로 순차적으로 실행됩니다.

2. 그림에 마우스를 가져다 데면 해당 작업에 대한 자세한 비용들이 보이게 됩니다. 이정보를 확인하여 예상 비용을 줄이는 작업을 줄이는 SQL 쿼리 튜닝을 진행합니다.
(쿼리 성능을 향상시키는데 가장 쉽고, 빠른 방법은 인덱스(index)와 조인(join)입니다. 추가적인 작업은 커서 제거, 임시 테이블 활용, 업데이트 문 대신 case문 사용하기 등이 있습니다.)

3. 비용들에 대한 자세한 설명은 아래의 "예상 실행계획 상세 설명"를 참고해 주세요.

 

 

예상 실행계획 상세 설명

물리적 연산 : index스캔, table스캔을 확인 (table 스캔은 풀 스캔이기 떄문에 인덱스 스캔이 좋음)
논리적 연산 : index스캔, table스캔을 확인 (table 스캔은 풀 스캔이기 떄문에 인덱스 스캔이 좋음)
예상 연산자 비용 :쿼리를 수행하는데 소요되는 연산 비용
예상 I/O 비용 : 서버의 하드디스크에 물리적으로 읽기 작업이 일어난 비용입니다. 작을 수록 좋습니다.
예상 하위 트리 비용 :쿼리를 수행하는데 소요되는 비용
예상 CPU 비용 :쿼리를 수행하는데 소요되는 CPU 비용
예상 실행 횟수 : 쿼리가 실행된 횟수
예상 행 수 : 쿼리의 예상 행 수
읽을 것으로 예상되는 행 수 :말그대로 읽을 것으로 쿼리의 예상 행 수
예상 행 크기 : 행의 크기(용량)
정렬됨 : clustered index가 적용되면 True값으로 나오고 아니면 False값이 나옵니다

Rows 실행된 행수
Executes Loop 일 경우 Loop가 실행된 횟수
StmtText PLAN_ROW 형식이 아닌 행에 대해 이 열에는 Transact-SQL 문의 텍스트가 포함됩니다. PLAN_ROW 유형의 행에 대해서는 이 열에 작업에 대한 설명이 포함됩니다. 이 열에는 물리적 연산자가 포함되며 논리 연산자가 포함될 경우도 있습니다. 이 열 다음에 물리적 연산자가 결정한 설명이 나올 경우도 있습니다. 자세한 내용은 논리 및 물리 연산자 참조를 참조하십시오.
StmtId 현재 일괄 처리에 있는 문의 수입니다. (몇번째 쿼리에 대한 통계인지)
NodeId 현재 쿼리의 노드 ID입니다. (현재 노드의 식별값)
Parent 부모 단계의 노드 ID입니다 (이 값이 같은 것 끼리, 같은 depth라고 생각하면 된다)
PhysicalOp 노드에 대한 물리적 구현 알고리즘입니다. PLAN_ROWS 형식의 행에만 해당됩니다.
LogicalOp 이 노드가 나타내는 관계형 대수 연산자입니다. PLAN_ROWS 형식의 행에만 해당됩니다.
Argument 수행되는 작업에 대한 추가 정보를 제공합니다. 물리적 연산자에 따라 이 열의 내용이 달라집니다.
DefinedValues 이 연산자가 사용하는 값에 대한 쉼표로 구분된 목록을 포함합니다. 이 값은 현재 쿼리에 있었던 계산된 식(예: SELECT 목록이나 WHERE 절에 있음)이거나 이 쿼리를 처리하기 위해 쿼리 프로세서에서 사용한 내부 값입니다. 쿼리 내의 어디에서든 정의된 이 값이 참조될 수 있습니다. PLAN_ROWS 형식의 행에만 해당됩니다.
EstimateRows 이 연산자가 생성한 출력의 예상 행 수입니다. PLAN_ROWS 형식의 행에만 해당됩니다.
EstimateIO 작업에 대한 예상 I/O 비용입니다. PLAN_ROWS 형식의 행에만 해당됩니다.
EstimateCPU 이 연산자에 대한 예상 CPU 비용입니다. PLAN_ROWS 형식의 행에만 해당됩니다.
AvgRowSize 이 연산자를 통해 통과되는 행의 예상 평균 행 크기(바이트)입니다.
TotalSubtreeCost 이 작업 및 모든 자식 작업에 대한 예상(누적) 비용입니다.
OutputList 현재 작업에서 예상하고 있는 열에 대한 쉼표로 구분된 목록을 포함합니다.
Warnings 현재 작업과 연관된 경고 메시지에 대한 쉼표로 구분된 목록을 포함합니다. 경고 메시지에 열 목록과 함께 “NO STATS:()” 문자열이 포함될 경우도 있습니다. 이 경고 메시지는 쿼리 최적화 프로그램이 이 열의 통계에 기초하여 결정을 내리려고 했지만 사용 가능한 통계가 없었음을 나타냅니다. 따라서 쿼리 최적화 프로그램이 추측을 해야 했고 결과적으로 비효율적인 쿼리 계획을 선택했을 수도 있습니다. 쿼리 최적화 프로그램이 더 효율적인 쿼리 계획을 선택할 수 있도록 통계를 만들거나 업데이트하는 방법은 UPDATE STATISTICS를 참조하십시오. 어떤 경우에는 이 열에 조인 조건자 없이 조인(테이블을 수반하는)이 일어났음을 나타내는 “MISSING JOIN PREDICATE” 문자열이 포함되기도 합니다. 실수로 조인 조건자를 삭제하면 예상보다 실행 시간이 긴 쿼리가 만들어지고 큰 결과 집합이 반환됩니다. 이 경고가 나타나면 조인 조건자를 의도적으로 사용하지 않았는지 확인하십시오.
Type 노드 유형. 각 쿼리의 부모 노드에 대해서는 노드 유형이 Transact-SQL 문 유형(예: SELECT, INSERT, EXECUTE 등)입니다. 실행 계획을 나타내는 하위 노드에 대해서는 PLAN_ROW 유형입니다.
Parallel 0 = 연산자가 병렬로 실행되지 않습니다.
1 = 연산자가 병렬로 실행됩니다.
EstimateExecutions 현재 쿼리를 실행하는 동안 이 연산자가 실행될 예상 횟수입니다.


이상으로 MSSQL 예상 실행 계획을 보는 방법과 내용에 대한 상세 설명에 대한 포스팅을 마치겠습니다.

반응형
그리드형

댓글