SQL Plan 분석
홈 화면 > 프로젝트 선택 > 분석 > SQL Plan 분석
데이터베이스에서 실행되는 SQL 문을 분석하여 성능 문제를 진단할 수 있는 유용한 자료를 제공합니다.
SQL Plan 분석는 Access Statistics 탭, Plan Change Summary 탭, Plan Change History 탭으로 구성되어 있습니다.
위 도입 문장의 탭 구성을 정정했습니다. 기존 문서는 Access Statistics와 Plan Change History 두 탭으로 안내하고 있었으나, 화면은 Access Statistics, Plan Change Summary, Plan Change History 세 탭입니다.
Access Statistics
Access Statistics 탭은 실행계획 저장 이력과 SQL 통계를 합쳐, 어떤 SQL이 어떤 방식으로 테이블을 읽고 있고 그중 무엇을 먼저 손봐야 하는지를 좁혀 가는 화면입니다. 넓은 기간의 추이에서 이상한 구간을 고르고, 그 구간의 SQL 목록으로 내려가고, 고른 SQL의 실행계획과 객체별 기여도까지 한 화면에서 이어 볼 수 있습니다. Oracle·Oracle Pro 인스턴스의 SQL 튜닝 대상을 고르는 DBA가 대상 독자입니다.
즉, Full Scan 발생 횟수를 세던 화면에서 부하가 큰 SQL이 무엇을 어떻게 읽는지 좁혀 가는 화면으로 바뀌었습니다.
화면이 전면 재구성되었습니다
기존의 Access Count·Operation Count 두 차트 구성은 더 이상 제공하지 않습니다. 추이 차트는 지표를 바꿔 볼 수 있는 하나로 합쳐졌고, 그 아래에 Access Type 집계·SQL 목록·실행계획·객체 요약 패널이 새로 놓였습니다.
패널 제목, 표의 컬럼 헤더, 옵션 버튼 라벨은 화면 언어 설정과 관계없이 영문으로 표시합니다. 일부 안내 문구와 깔때기 라벨만 화면 언어를 따릅니다.
화면 구성
| Block | Description |
|---|---|
| 조회 조건 | 기간·인스턴스·필터·집계 옵션을 한 묶음으로 설정한 뒤 검색 |
SQL Count 추이 | 기간 전체를 시간 버킷 막대로 표시. 막대를 끌어 분석 구간 지정 |
Access Type Summary | 분석 구간의 Access Type별 SQL 수·실행 횟수·비중 |
Access Type by SQL | SQL별 Access Type 구성과 성능 지표 목록 |
Execution Plan | 목록에서 고른 SQL의 실행계획 트리 |
Object Summary | 고른 SQL이 읽는 객체별 요약 |
조회 기간과 분석 구간은 다릅니다
추이 차트는 조회 기간 전체를 집계로 보여 주고, 그 아래 목록·실행계획·객체 요약은 차트에서 지정한 분석 구간만 원본 행으로 조회합니다. 최대 3개월치 실행계획 단계를 한 번에 받으면 응답이 감당되지 않기 때문에 나눈 구조라고 합니다.
화면에 처음 들어가면 분석 구간은 가장 최근 버킷 하나로 잡힙니다. 넓히려면 차트에서 구간을 끌어 고르거나, Access Type by SQL 패널 머리의 기간 전체 버튼을 선택하세요.
조회 조건 설정하기
-
분석 > SQL Plan 분석의 Access Statistics 탭으로 이동하세요.
-
시간 옵션에서 조회 기간을 선택하세요. 기본값은 1일이고 최대 3개월(91일)까지 지정할 수 있습니다.
-
인스턴스 옵션에서 조회할 인스턴스를 선택하세요.
-
필요하면 필터 옵션에서 조건을 추가하세요. 처음 들어가면
Access Type=TABLE ACCESS FULL조건이 이미 걸려 있습니다. -
Exclude system objects 스위치로 시스템 오브젝트 조회를 목록에서 뺄지 정하세요. 기본값은 켜짐입니다.
-
버튼을 클릭하세요.
기간·인스턴스·필터·집계 옵션은 한 묶음이라 검색 버튼을 눌러야 함께 반영됩니다. 반면 Access Type by SQL 패널의 표시 제어(정렬 기준·표시 건수·하한·집계 기준·컬럼 설정)는 이미 받아 온 데이터를 다시 계산할 뿐이라 고르는 즉시 반영됩니다.
필터 조건
| Key | Description |
|---|---|
Access Type | 실행계획의 접근 방식. 예: TABLE ACCESS FULL |
Owner | 오브젝트 소유자 스키마 |
Object Name | 오브젝트 이름 |
조건은 같음(=)과 같지 않음(!=) 두 연산자를 지원합니다. 같지 않음을 쓰면 특정 스키마나 오브젝트를 목록에서 빼고 볼 수 있습니다.
필터는 실행계획 단계가 아니라 SQL 단위로 걸립니다. 조건에 맞는 단계를 하나라도 가진 SQL이면 그 SQL의 단계 전부가 목록에 남습니다. 단계 단위로 걸면 나머지 단계가 사라져 구성 비율이 실제와 달라지기 때문이라고 합니다.
시스템 오브젝트 제외
SYS·SYSTEM·XDB 같은 딕셔너리 스키마와 X$·V$·DBA_ 접두 오브젝트만 읽는 조회를 목록에서 뺍니다. 사용자 오브젝트를 하나도 건드리지 않는 조회를 재귀 SQL로 보는 방식이라 완전한 판정은 아니며, 기본값이 켜짐인 것은 FIXED TABLE FULL 같은 딕셔너리 조회가 사용자 SQL을 가리는 문제를 막기 위해서입니다.
SQL Count 추이 보기
차트 머리의 두 옵션으로 무엇을 어떤 해상도로 볼지 고릅니다.
| Option | Value | Description |
|---|---|---|
Metric | SQL Count · Executions · Elapsed | 막대가 나타내는 지표. 기본값은 SQL Count |
Interval | Hour · Day · Week | 막대 하 나가 담는 시간 폭 |
Metric을 고르면 패널 제목도 함께 바뀝니다. 고른 Access Type은 모집단을 줄이지 않고 전체 막대 위에 겹쳐 그리므로, 전체 대비 그 유형이 차지하는 몫을 그대로 읽을 수 있습니다.
Interval Hour는 7일까지만 고를 수 있습니다
조회 기간이 7일을 넘으면 Hour 버튼이 비활성화되고 「7일을 넘는 조회에서는 시간 단위로 볼 수 없습니다」 안내를 표시합니다. 7일이면 시간 버킷이 168개라 아직 막대를 집을 수 있지만 그 이상에서는 구간을 고르는 조작이 어려워지기 때문입니다.
Interval을 고르지 않았거나 지금 조회 기간에서 쓸 수 없는 값이면 기간이 단위를 정합니다. 이틀 이하는 Hour, 그보다 길면 Day입니다.
분석 구간은 막대를 클릭하거나 여러 막대를 끌어서 지정합니다. 지정한 구간이 아래 패널 세 개의 조회 범위가 됩니다.
Access Type Summary 읽기
분석 구간에서 Access Type별로 얼마나 쓰였는지 집계합니다.
| Column | Description |
|---|---|
Access Type | 실행계획 접근 방식 |
SQL Count | 그 접근 방식을 쓴 SQL 수 |
Executions | 실행 횟수 합계 |
Share | 실행 횟수 기준 비중 |
한 SQL이 Full Scan과 Range Scan을 함께 쓰면 양쪽에 모두 더해집니다. 즉, Share는 「이 접근 방식을 쓰는 SQL이 차지하는 몫」으로 읽는 값이고 합계가 100%를 넘을 수 있습니다.
Access Type by SQL 목록 다루기
목록은 SQL과 실행계획(sql_id + plan_hash_value) 조합 한 줄씩으로 구성됩니다.
표시 제어
| Option | Default | Description |
|---|---|---|
| 정렬 기준 | Logical IO | Logical IO · Elapsed · Executions · LIO / exec · Full Steps 중 선택 |
| 표시 건수 | Top 50 | Top 20부터 Top 1,000까지, No limit 선택 가능 |
Minimum executions | 0 | 실행 횟수 하한 |
Minimum LIO per execution | 0 | 실행당 논리 읽기 하한 |
Basis | Range Total | 지표 집계 기준. Range Total은 구간 합산, Latest Plan은 최신 실행계획 기준 |
두 하한값의 기본값이 0인 것은 화면에 들어오자마자 일부 SQL이 조용히 빠지는 일을 막기 위해서입니다. 목록 길이는 표시 건수로 이미 묶여 있으니, 하한은 필요할 때 올려서 좁히는 도구로 쓰면 됩니다.
깔때기 표시
패널 머리에 목록이 어디서 얼마나 줄었는지를 세 단계로 보여 줍니다.
| Step | Description |
|---|---|
| 구간 내 | 분석 구간에 들어온 SQL 수 |
| 조건 통과 | 필터와 하한 조건을 통과한 SQL 수 |
| 표시됨 | 표에 실제로 그려진 행 수 |
앞의 두 값은 SQL 수, 마지막 값은 행 수입니다. 행이 SQL과 실행계획 조합 단위라 단위가 다릅니다.
컬럼 구성
| Group | Column | Description |
|---|---|---|
SQL | sql_id · plan_hash_value · query_text | SQL 식별자와 원문 |
Composition | Steps · Breakdown | 실행계획 단계 수와 Access Type 구성 막대 |
Performance | Executions · LIO/exec · Elapsed/exec(s) | 실행 횟수와 실행당 부하 |
Access Type 컬럼은 위험도에 따라 High Risk·Caution·Normal·Hidden 네 묶음으로 나뉩니다. 표시할 유형은 컬럼 설정에서 고를 수 있고, 정의표에 걸리지 않은 나머지 단계는 Others 컬럼에 모입니다.
기본으로 켜지는 Access Type은 다음과 같습니다.
| Access Type | Tier |
|---|---|
TABLE ACCESS FULL | High Risk |
PARTITION RANGE ALL | High Risk |
INDEX SKIP SCAN | Caution |
INDEX FAST FULL SCAN | Caution |
INDEX FULL SCAN | Caution |
INDEX RANGE SCAN | Normal |
INDEX UNIQUE SCAN | Normal |
TABLE ACCESS BY INDEX ROWID | Normal |
TABLE ACCESS STORAGE FULL·BITMAP INDEX·MAT_VIEW ACCESS·HASH JOIN·NESTED LOOPS·MERGE JOIN·FIXED TABLE FULL은 기본으로 숨겨져 있으며 컬럼 설정에서 켤 수 있습니다.
고른 SQL 자세히 보기
목록에서 행을 선택하면 아래 두 패널이 그 SQL의 내용으로 채워집니다.
Execution Plan
| Column | Description |
|---|---|
Operation | 실행계획 단계 |
Object | 접근 대상 객체 |
Cost | 옵티마이저가 매긴 비용 |
Object Summary
| Column | Description |
|---|---|
Object | 객체 이름 |
Access Type | 그 객체를 읽는 방식 |
Index | 사용한 인덱스 |
Cost Share | 전체 비용에서 차지하는 비중 |
표는 Cost Share 내림차순으로 먼저 정렬됩니다. 부하에 가장 많이 기여하는 객체가 맨 위에 오도록 한 것이며, 컬럼 헤더를 클릭해 정렬을 바꿀 수 있습니다.