DMC SQLAnalyzer v0.5 Enterprise

DDL 스키마 & 대상 SQL 쿼리 입력

1. DDL 파일 업로드
2 Tables · 9 Columns
PK: users(user_id), orders(order_id) FK: orders(user_id) → users
2. 대상 SQL 쿼리 입력 target_query.sql
14 Tokens · 5 Lines
SELECT Statement (Analytical Join) Line: 1-5
분석 준비 완료: 8개 정밀 검증 모듈 대기 중    스키마 메타데이터 액티브 캐시 활성화
[1]

사용 테이블 분석

2 Detected Tables
users (u) 선행 구동 (Driving Table)
NL Join →
orders (o) 후행 구동 (Driven Table)
분석 대상 테이블 선택 (클릭 시 세부 스키마 & 인덱스 확인) Interactive Selector
users AS u DRIVING
48,000 건 5 Cols · 1 Index
orders AS o DRIVEN
1,240,000 건 5 Cols · 2 Indexes
users (u) 세부 정보 선행 구동 테이블
컬럼명 데이터 타입 제약조건 SQL 역할 / 필터
user_id BIGINT PRIMARY KEY 조인 키 (Join Key)
user_name VARCHAR(50) NOT NULL SELECT 프로젝션
grade VARCHAR(20) NULLABLE WHERE = 'VIP' (조건)
created_at DATETIME NULLABLE 미사용
[2]

사용 컬럼 분석

SELECT + 조건절 연동
프로젝션 컬럼 (SELECT) 3 Cols (최소 I/O)
  • u.user_name 문자열 (출력)
  • o.order_id PK (필수열)
  • o.total_amount 정렬 키 대상
조건 & 조인 컬럼 [Where/Join] 3 Cols Filter
  • u.user_id = o.user_id JOIN 일치 (PK)
  • o.order_date 가공(DATE) 중지
  • u.grade 선택도 <10% (VIP)
필요 컬럼만 명시하여 불필요한 풀 페어 전송 오버헤드가 없습니다. (SELECT * 미사용 우수)
[3]

JOIN 관계 분석

Cartesian Risk: None (Safe)
users (u) PK: user_id (1)
1 : N Relationship
1 FK: o.user_id = u.user_id N
orders (o) FK: user_id (N)
추천 조인 알고리즘
Nested Loop Join (NLJ)

동등 인덱스 매칭 시 최적 속도 보장

해시 조인(Hash Join) 호환성
등치 조건(=) 100% 호환

대용량 배치 시 Hash Join 대체 가능

[4]

WHERE 조건 분석

1 Non-SARGable Alert
DATE(o.order_date) = '2026-09-10' Non-SARGable 경고

좌변 컬럼 가공(DATE())으로 인해 order_date에 생성된 B-Tree 인덱스를 타지 못하고 테이블 풀스캔을 유발합니다.

권고 개선문 (Sargable Scan 전환):
o.order_date >= '2026-09-10 00:00:00' AND o.order_date < '2026-09-11 00:00:00'
u.grade = 'VIP' SARGable 적용

순수 등치 조건(단일 인덱스 즉각 활용 가능). 선행 Driving 테이블 전원의 부합하여 결과셋을 10% 이내로 축소시킵니다.

[5]

서브쿼리 구조 분석

단일 조인 최적화
서브쿼리 부재 (Clean Structure)

복합 다중 파생 뷰(Derived Table) 및 상관 서브쿼리가 존재하지 않습니다.

  • 임시 메모리(Temp Table) 생성 부재로 불필요한 메모리/디스크 스왑이 발생하지 않는 구조입니다.
  • CTE(WITH 절) 리팩토링 불필요: 메인 쿼리 1건과 1개의 INNER JOIN으로 이루어져 파싱 깊이가 최소(Depth 1)입니다.
  • 반복 연산 RBAR: 0% 쿼터당 재실행되는 Dependent Subquery 리스크가 없습니다.
[6]

SQL 논리 & 물리 실행 흐름 (Execution Pipeline)

5-Stage Pipeline
1
FROM & FILTER users 테이블 Driving 결정

users 테이블에서 grade = 'VIP' 조건을 적용하여 대상 행을 약 4,800건으로 초기 필터링합니다.

2
INNER JOIN orders 테이블 결합

필터링된 사용자의 user_id를 키로 orders.user_id와 일치하는 주문 데이터를 순차 결합합니다.

3
WHERE FILTER (Driving 후행필터 필수 검증)

조인된 각 주문 행의 DATE(order_date)를 매번 평가하여 '2026-09-10'과 비교 (CPU 가공 부하 지점).

4
PROJECTION (SELECT) 컬럼 추출

최종 결과에 필요한 user_name, order_id, total_amount 3개 속성만을 슬라이스 출력합니다.

5
ORDER BY (Filesort) 메모리 정렬 부하

total_amount DESC 정렬을 위해 작업 버퍼(sort_buffer) 내에서 메모리/임시 파일 정렬을 수행합니다.

[7]

예상 성능 저하 요소 안내

Bottleneck Detected
RISK 1 - HIGH DATE() 함수 가공에 따른 Full Scan 발생

DATE(o.order_date) 로 인해 orders 테이블 1,240,000건 전체에 대해 함수를 개별 실행하며 인덱스 엔트리 전체를 훑게 됩니다. (디스크 I/O 급증의 최대 원인)

예상 I/O 블록 읽기: 10,420 Blocks (Full Read)
RISK 2 - MEDIUM Using filesort (정렬 전용 인덱스 부재)

ORDER BY total_amount DESC 구문을 충족하는 정렬 인덱스가 없어 버퍼(sort_buffer) 내에서 직접 정렬을 실행합니다. 동시 접속 급증 시 메모리 고갈 위험이 있습니다.

Sort Overhead: Sort Buffer / Temp File Spill 가능
예상 쿼리 튜닝 시간 단축 효과:
142.8ms 0.9ms
99.4% 개선율 TPS 150배 향상 예상
[8]

인덱스 후보 추천 & DDL 생성

2 Optimized Indexes
추천 1 (Primary Recommended) 선행 제거 - 멀티 컬럼
CREATE INDEX idx_orders_date_amt_usr ON orders (order_date, total_amount DESC, user_id);
• 권고 사유:
  • order_date: WHERE 범위 조건 인덱스 Range Scan 전용 유도
  • total_amount DESC: B-Tree 역순 탐색으로 Using filesort 100% 제거
  • user_id: 조인 조건 컬럼을 후방에 포함하여 커버링 인덱스(Covering) 지원
추천 2 (Supporting Filter) 선행 Driving 테이블 고속화
CREATE INDEX idx_users_grade_uid ON users (grade, user_id);
• 권고 사유:
  • grade = 'VIP' 조건율 테이블 풀스캔 없이 인덱스 단독 즉각 스캔 후 user_id 추출