본문으로 건너뛰기

5.1. 데이터베이스에 무엇을 물어볼 수 있나

표 구조·관계도·통계·느린 쿼리 — 접속 도구를 열지 않고 말로 묻기

위젯은 데이터베이스에 직접 연결해 답합니다. 지표를 대신 읽어 주는 것이 아니라 표 구조를 읽고, 통계를 세고, 쿼리 계획을 받아 옵니다.

접속 도구를 따로 켜지 않고 한국어로 물으면 됩니다.

먼저 — 어느 DB 인지 밝힙니다

여러 데이터베이스가 등록돼 있을 수 있어, 질문에 대상을 넣어야 합니다.

"<DB 이름> 에서 <테이블> 구조 보여 줘"

이름을 모르면 먼저 물어보십시오.

"어떤 데이터베이스에 연결할 수 있어?"

등록된 연결과 현재 상태가 목록으로 옵니다. 그 이름을 그대로 쓰면 됩니다.

MySQL · MariaDB · PostgreSQL · Oracle · SQL Server 를 다룹니다. 종류에 따라 받아 올 수 있는 항목이 조금씩 다릅니다.

1. 구조를 볼 때

어떤 표가 있나

"이 DB 에 어떤 테이블이 있어?" "스키마 목록 보여 줘"

표와 뷰가 함께 나옵니다. 스키마가 여럿이면 스키마부터 물으십시오.

표 하나를 자세히

"USERS 테이블 구조 알려 줘"

칸 목록에 인덱스와 제약조건까지 함께 옵니다. 타입과 널 허용 여부를 확인할 때 가장 많이 쓰는 질문입니다.

만든 문장 그대로

"USERS 테이블 DDL 보여 줘"

CREATE TABLE 문을 그대로 받습니다. 다른 환경에 같은 표를 만들 때 씁니다.

칸 이름으로 찾기

"user_id 라는 칸이 들어 있는 테이블 다 찾아 줘"

표 이름을 모를 때 씁니다. 이름 조각으로 전체 표를 검사해 어디에 그 칸이 있는지 찾아 줍니다. 표가 수백 개인 스키마에서 특히 쓸모가 있습니다.

관계도(ERD)

"주문 관련 테이블 ERD 그려 줘"

표들이 어떻게 이어져 있는지 그림으로 옵니다. 읽는 법과 그림이 접는 것 세 가지실행 계획과 ERD 읽기에서 다룹니다.

2. 상태를 볼 때

지금 DB 가 어떤 상태인지 묻는 것들입니다. 장애를 살필 때 씁니다.

물어보는 말돌아오는 것
"DB 상태 어때?"접속 수, 캐시 적중률, 가동 시간, 경고
"지금 돌고 있는 세션 보여 줘"세션 ID·사용자·실행 중인 쿼리·대기 이벤트·막힌 세션
"락 걸린 거 있어?"잠금을 쥔 쪽과 기다리는 쪽, 막힘 연쇄
"느린 쿼리 뭐 있어?"쿼리 문장·수행 시간·읽은 행 수·시각

응답이 느릴 때 보는 순서

DB 응답이 느릴 때 보는 순서

막힘 연쇄가 보이면 거기서 멈춥니다. 뒤에 줄 선 쿼리들은 원인이 아니라 결과입니다.

3. 크기와 인덱스를 볼 때

"ORDERS 테이블 통계 보여 줘"

행 수, 차지하는 크기, 인덱스 개수, 변경 통계가 옵니다. 표가 얼마나 큰지 먼저 알아야 실행 계획의 전체 스캔이 문제인지 판단할 수 있습니다.

"ORDERS 인덱스 잘 쓰이고 있어?"

인덱스별로 몇 번 쓰였는지, 읽은 행이 얼마인지 나옵니다. 한 번도 안 쓰인 인덱스도 짚어 줍니다. 안 쓰이는 인덱스는 조회를 돕지 못하면서 쓰기를 느리게 합니다.

4. 쿼리를 분석할 때

계획만 보고 싶을 때

"이 쿼리 실행 계획 보여 줘 — SELECT ..."

DB 가 그 쿼리를 어떤 순서로 처리하는지 트리로 옵니다.

왜 느린지까지 알고 싶을 때

"이 쿼리 왜 느린지 분석해 줘 — SELECT ..."

이쪽이 더 많이 합니다. 실행 계획만 나오는 것이 아니라 관련 표의 구조·인덱스·통계를 같이 모아 봅니다.

  • 전체 스캔·빠진 인덱스 같은 문제를 짚어 줍니다
  • 고칠 방향을 제안합니다
  • 관련 표의 관계도(ERD)가 함께 옵니다

느린 쿼리를 다룰 때는 이 질문을 기본으로 쓰십시오. 계획만 보면 "무엇을 했는지" 는 알아도 "왜 그렇게 했는지" 는 알기 어렵습니다.

OPENMARU APM 을 쓴다면

쿼리를 옮겨 적을 필요가 없습니다. 트랜잭션 상세에서 버튼 하나로 같은 분석을 실행합니다(APM 에서 SQL 을 눌러 바로 진단하기).

5. 직접 조회할 때

"<DB 이름> 에서 어제 취소된 주문 건수 세어 줘"

말로 물으면 쿼리를 만들어 실행하고 결과를 표로 보여 줍니다. SQL 을 직접 적어 줘도 됩니다.

무엇이 허용되는지는 관리자가 정합니다

연결마다 범위가 다릅니다. 읽기 전용으로 설정된 연결에서는 데이터를 바꾸는 쿼리가 거부됩니다. 관리자는 그 밖에도 다음 제한을 둘 수 있습니다.

  • 특정 SQL 낱말 금지
  • 특정 표 금지
  • 허용된 표만 조회

막히면 이유가 답변에 나옵니다. 필요한 조회가 막혀 있다면 화면에서 풀 수 있는 것이 아니므로 관리자에게 문의하십시오.

운영 데이터베이스에 연결되어 있을 수 있습니다. 세는 질문이라도 범위를 좁혀 묻는 편이 안전합니다. 기간이나 조건 없이 큰 표를 전부 읽으면 DB 에 부담이 갑니다.

잘 안 될 때

"어느 연결인지 모르겠다" 는 답이 온다

DB 이름을 안 밝혔거나 등록된 이름과 다릅니다. "어떤 데이터베이스에 연결할 수 있어?" 로 목록을 먼저 받으십시오.

표를 못 찾는다고 한다

  • 스키마가 다를 수 있습니다 — "스키마 목록 보여 줘" 로 확인하십시오
  • 대소문자 — Oracle 은 대문자로 저장되는 경우가 많습니다
  • 관계도에서 본 이름을 그대로 썼다면 틀릴 수 있습니다. 그림은 특수문자를 밑줄로 바꿔 표시합니다 (503 장 참고)

어떤 항목이 비어 있다

DB 종류마다 내주는 통계가 다릅니다. 실제 수행 시간이나 I/O 값이 안 보이는 것은 그 DB 가 주지 않기 때문이지 잘못된 것이 아닙니다.

다음으로