본문으로 건너뛰기

5.3. 실행 계획과 ERD 읽기

답변과 함께 오는 두 그림 — 트리 모양 실행 계획과 표 관계도

데이터베이스를 물어보면 글만 오지 않습니다. 그림이 함께 옵니다. 두 가지입니다.

그림언제 오나무엇을 보여 주나
실행 계획 (트리)쿼리를 분석했을 때DB 가 그 쿼리를 어떤 순서로 처리하는가
ERD (관계도)스키마를 물었을 때표들이 어떻게 이어져 있는가

둘 다 끌어서 옮기고 확대할 수 있습니다. 큰 그림은 위젯 폭을 넘기므로 다루는 법을 아는 편이 낫습니다.

1. 실행 계획 트리​

느린 쿼리를 물으면 이런 트리가 함께 옵니다. 가장 바깥 작업이 위, 실제로 표를 읽는 작업이 아래쪽 끝에 놓입니다.

실행 계획 트리 — 위가 SELECT STATEMENT, 아래 끝이 실제로 표를 읽는 단계

노드 하나에 적힌 것​

실행 계획 노드 하나에 적힌 것

▼ 3 이 붙어 있으면 아래에 3개가 접혀 있다는 뜻입니다. 노드를 누르면 펼쳐집니다.

색이 접근 방식을 말해 줍니다​

노드 색은 그 표를 어떻게 읽었는지로 정해집니다. 이것 하나만 봐도 어디가 문제인지 알 수 있습니다.

색접근 방식뜻
빨강FULL SCAN표를 처음부터 끝까지 읽었다 — 가장 먼저 볼 곳
노랑그 밖확인해 볼 만함
초록INDEX RANGE인덱스로 범위를 좁혀 읽음
하늘INDEX인덱스만 읽고 끝냄
파랑UNIQUE한 건을 바로 찾음 — 가장 나음

빨강부터 봅니다. 작은 표라면 전체를 읽어도 문제가 아니지만, 큰 표에서 빨강이면 대개 그것이 원인입니다.

위 그림에서 가운데의 TABLE ACCESS FULL 이 빨간 점입니다. 나머지 INDEX RANGE SCAN 들과 한눈에 구별됩니다.

비용 막대 ■ 는 상대값입니다​

■ · ■■ · ■■■ 는 이 계획 안에서 가장 비싼 노드를 기준으로 한 표시입니다. 다른 쿼리의 ■■■ 와 견줄 수 없습니다.

막대마우스를 올리면뜻
■■■Critical이 계획에서 가장 무거운 단계
■■High무겁다
■Moderate보통
(없음)Low가볍다

cost 숫자 자체는 DB 가 매긴 추정치입니다. 초가 아닙니다. 서로 다른 DB 의 cost 를 비교하는 것도 뜻이 없습니다. 같은 계획 안에서 어디가 더 무거운지를 보는 값입니다.

표로도 옵니다​

트리와 함께 단계별 비용을 표로 정리해 주기도 합니다.

실행 계획 표 — 단계별 Operation·Cost·예상 행 수

마우스를 올리면 더 나옵니다​

라벨에는 자리가 없어 접어 둔 값들이 툴팁에 있습니다.

  • Access — 접근 방식 원문
  • Est. Rows / Actual Rows — 예상한 행 수와 실제 읽은 행 수
  • Filtered — 읽은 것 중 남은 비율
  • Actual Time — 실제 걸린 시간(ms)
  • I/O — 읽고 쓴 블록 수 (buf · read · write)

예상과 실제가 크게 벌어지면 통계가 낡았을 수 있습니다. DB 가 100건을 예상하고 10만 건을 읽었다면, 그 오판 때문에 계획이 틀어진 것입니다.

Actual 값과 I/O 는 DB 와 수집 방식에 따라 없을 수도 있습니다. 안 보인다고 잘못된 것이 아닙니다.

모양으로 끝인지 아는 법​

  • 작은 동그라미 — 더 이상 아래가 없는 마지막 단계. 실제로 데이터를 읽는 곳입니다
  • 둥근 네모 — 아래에 더 있는 단계

2. 실행 계획 다루기​

트리 오른쪽 위에 버튼이 있습니다. 실행 계획 같은 트리 차트에만 나옵니다.

버튼하는 일
확대 · 축소한 번에 조금씩
화면 맞춤처음 상태로 되돌립니다. 헤매면 이것부터
모두 펼치기접힌 노드를 한 번에 전부 펼칩니다
전체화면위젯을 넘어 화면 전체로. ESC 로 닫습니다

버튼 말고 마우스로도 다룰 수 있습니다.

  • 끌어서 옮기기 — 빈 곳을 잡고 끕니다
  • 휠 굴리기 — 확대·축소
  • 노드 누르기 — 그 가지만 펼치거나 접습니다

큰 계획을 볼 때​

계획이 열 단계를 넘으면 위젯 폭에서 겹쳐 보입니다. 전체화면 → 모두 펼치기 순서가 편합니다. 다 펼친 뒤 빨강 노드를 찾고, 거기서부터 위로 거슬러 올라갑니다.

3. ERD — 표 관계도​

"이 스키마 구조 보여 줘" 처럼 물으면 표와 관계를 그린 그림이 옵니다. 쿼리를 분석할 때도 관련된 표들의 관계도가 함께 옵니다.

쿼리에 얽힌 표들의 관계도와 병목 지점

표기 읽기​

ORDERS {
bigint order_id PK
bigint customer_id FK
string status
}

ORDERS }o--|| CUSTOMERS : "customer_id"
표기뜻
PK기본 키 — 이 표에서 한 건을 가리키는 칸
FK외래 키 — 다른 표를 가리키는 칸
`}o--
선 위의 글자이어 주는 칸 이름

위 그림은 주문 여러 건이 고객 하나에 이어진다고 읽습니다. 화살표 없이도 }o 가 붙은 쪽이 "여럿" 입니다.

조작​

하는 법결과
끌기옮기기
휠 굴리기마우스를 둔 자리를 중심으로 확대·축소
초기화 버튼화면에 딱 맞게 되돌립니다
전체화면 버튼화면 전체로. ESC 로 닫습니다

그림 위에서 휠을 굴리면 대화가 스크롤되지 않고 그림이 확대됩니다. 대화를 내리려면 그림 바깥에서 굴리십시오.

ERD 는 요약본입니다 — 세 가지를 접습니다​

스키마 그대로가 아닙니다. 읽기 쉽게 줄인 그림이라 다음 셋이 빠집니다.

하나. 칸은 표마다 10개까지만 보입니다. 넘으면 마지막 줄에 more__12_columns 처럼 남은 개수만 적힙니다. 특정 칸을 찾는 중이라면 그림 대신 "ORDERS 테이블 칸 다 보여 줘" 라고 다시 물으십시오.

둘. 같은 두 표 사이의 관계는 한 줄만 그립니다. ORDERS 가 USERS 를 두 번 가리켜도(주문자·수령자) 선은 하나만 나옵니다. 관계가 몇 개인지 세는 용도로는 쓰지 마십시오.

셋. 이름의 특수문자가 밑줄로 바뀝니다. order-items 는 그림에서 order_items 로 보입니다. 그림의 이름을 그대로 복사해 쿼리에 쓰면 표를 못 찾을 수 있습니다.

이 셋 때문에 ERD 는 "어떻게 이어져 있나" 를 볼 때 쓰고, 정확한 칸 이름·타입이 필요하면 글로 다시 물어보는 편이 낫습니다.

4. 그림이 안 보일 때​

자리는 있는데 비어 있다​

초기화(ERD)나 화면 맞춤(실행 계획)을 눌러 보십시오. 확대해 놓은 상태에서 그림이 화면 밖으로 밀려나 있을 수 있습니다.

"Mermaid 렌더링 오류" 가 나왔다​

그림 문법이 깨진 경우입니다. 오류 아래에 원본 코드가 그대로 나오므로 무엇이 문제인지 확인할 수 있습니다. 대개 다시 물어보면 정상으로 옵니다.

실행 계획이 아예 없다​

쿼리 분석 답에 계획 트리가 없다면 DB 에서 계획을 받아 오지 못한 것입니다. 권한이 없거나, 계획을 받아 올 수 없는 형태의 쿼리일 수 있습니다. 답변 글에 그 사유가 적혀 있는지 보십시오.

다음으로​