본문으로 건너뛰기

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 테이블 칸 다 보여 줘" 라고 다시 물으십시오.

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

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

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

4. 그림이 안 보일 때

자리는 있는데 비어 있다

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

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

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

실행 계획이 아예 없다

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

다음으로