본문으로 건너뛰기

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 목록·실행계획·객체 요약 패널이 새로 놓였습니다.

패널 제목, 표의 컬럼 헤더, 옵션 버튼 라벨은 화면 언어 설정과 관계없이 영문으로 표시합니다. 일부 안내 문구와 깔때기 라벨만 화면 언어를 따릅니다.

화면 구성​

BlockDescription
조회 조건기간·인스턴스·필터·집계 옵션을 한 묶음으로 설정한 뒤 검색
SQL Count 추이기간 전체를 시간 버킷 막대로 표시. 막대를 끌어 분석 구간 지정
Access Type Summary분석 구간의 Access Type별 SQL 수·실행 횟수·비중
Access Type by SQLSQL별 Access Type 구성과 성능 지표 목록
Execution Plan목록에서 고른 SQL의 실행계획 트리
Object Summary고른 SQL이 읽는 객체별 요약
노트

조회 기간과 분석 구간은 다릅니다

추이 차트는 조회 기간 전체를 집계로 보여 주고, 그 아래 목록·실행계획·객체 요약은 차트에서 지정한 분석 구간만 원본 행으로 조회합니다. 최대 3개월치 실행계획 단계를 한 번에 받으면 응답이 감당되지 않기 때문에 나눈 구조라고 합니다.

화면에 처음 들어가면 분석 구간은 가장 최근 버킷 하나로 잡힙니다. 넓히려면 차트에서 구간을 끌어 고르거나, Access Type by SQL 패널 머리의 기간 전체 버튼을 선택하세요.

조회 조건 설정하기​

  1. 분석 > SQL Plan 분석의 Access Statistics 탭으로 이동하세요.

  2. 시간 옵션에서 조회 기간을 선택하세요. 기본값은 1일이고 최대 3개월(91일)까지 지정할 수 있습니다.

  3. 인스턴스 옵션에서 조회할 인스턴스를 선택하세요.

  4. 필요하면 필터 옵션에서 조건을 추가하세요. 처음 들어가면 Access Type = TABLE ACCESS FULL 조건이 이미 걸려 있습니다.

  5. Exclude system objects 스위치로 시스템 오브젝트 조회를 목록에서 뺄지 정하세요. 기본값은 켜짐입니다.

  6. 검색 아이콘 버튼을 클릭하세요.

노트

기간·인스턴스·필터·집계 옵션은 한 묶음이라 검색 버튼을 눌러야 함께 반영됩니다. 반면 Access Type by SQL 패널의 표시 제어(정렬 기준·표시 건수·하한·집계 기준·컬럼 설정)는 이미 받아 온 데이터를 다시 계산할 뿐이라 고르는 즉시 반영됩니다.

필터 조건​

KeyDescription
Access Type실행계획의 접근 방식. 예: TABLE ACCESS FULL
Owner오브젝트 소유자 스키마
Object Name오브젝트 이름

조건은 같음(=)과 같지 않음(!=) 두 연산자를 지원합니다. 같지 않음을 쓰면 특정 스키마나 오브젝트를 목록에서 빼고 볼 수 있습니다.

필터는 실행계획 단계가 아니라 SQL 단위로 걸립니다. 조건에 맞는 단계를 하나라도 가진 SQL이면 그 SQL의 단계 전부가 목록에 남습니다. 단계 단위로 걸면 나머지 단계가 사라져 구성 비율이 실제와 달라지기 때문이라고 합니다.

시스템 오브젝트 제외​

SYS·SYSTEM·XDB 같은 딕셔너리 스키마와 X$·V$·DBA_ 접두 오브젝트만 읽는 조회를 목록에서 뺍니다. 사용자 오브젝트를 하나도 건드리지 않는 조회를 재귀 SQL로 보는 방식이라 완전한 판정은 아니며, 기본값이 켜짐인 것은 FIXED TABLE FULL 같은 딕셔너리 조회가 사용자 SQL을 가리는 문제를 막기 위해서입니다.

SQL Count 추이 보기​

차트 머리의 두 옵션으로 무엇을 어떤 해상도로 볼지 고릅니다.

OptionValueDescription
MetricSQL Count · Executions · Elapsed막대가 나타내는 지표. 기본값은 SQL Count
IntervalHour · Day · Week막대 하나가 담는 시간 폭

Metric을 고르면 패널 제목도 함께 바뀝니다. 고른 Access Type은 모집단을 줄이지 않고 전체 막대 위에 겹쳐 그리므로, 전체 대비 그 유형이 차지하는 몫을 그대로 읽을 수 있습니다.

노트

Interval Hour는 7일까지만 고를 수 있습니다

조회 기간이 7일을 넘으면 Hour 버튼이 비활성화되고 「7일을 넘는 조회에서는 시간 단위로 볼 수 없습니다」 안내를 표시합니다. 7일이면 시간 버킷이 168개라 아직 막대를 집을 수 있지만 그 이상에서는 구간을 고르는 조작이 어려워지기 때문입니다.

Interval을 고르지 않았거나 지금 조회 기간에서 쓸 수 없는 값이면 기간이 단위를 정합니다. 이틀 이하는 Hour, 그보다 길면 Day입니다.

분석 구간은 막대를 클릭하거나 여러 막대를 끌어서 지정합니다. 지정한 구간이 아래 패널 세 개의 조회 범위가 됩니다.

Access Type Summary 읽기​

분석 구간에서 Access Type별로 얼마나 쓰였는지 집계합니다.

ColumnDescription
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) 조합 한 줄씩으로 구성됩니다.

표시 제어​

OptionDefaultDescription
정렬 기준Logical IOLogical IO · Elapsed · Executions · LIO / exec · Full Steps 중 선택
표시 건수Top 50Top 20부터 Top 1,000까지, No limit 선택 가능
Minimum executions0실행 횟수 하한
Minimum LIO per execution0실행당 논리 읽기 하한
BasisRange Total지표 집계 기준. Range Total은 구간 합산, Latest Plan은 최신 실행계획 기준

두 하한값의 기본값이 0인 것은 화면에 들어오자마자 일부 SQL이 조용히 빠지는 일을 막기 위해서입니다. 목록 길이는 표시 건수로 이미 묶여 있으니, 하한은 필요할 때 올려서 좁히는 도구로 쓰면 됩니다.

깔때기 표시​

패널 머리에 목록이 어디서 얼마나 줄었는지를 세 단계로 보여 줍니다.

StepDescription
구간 내분석 구간에 들어온 SQL 수
조건 통과필터와 하한 조건을 통과한 SQL 수
표시됨표에 실제로 그려진 행 수

앞의 두 값은 SQL 수, 마지막 값은 행 수입니다. 행이 SQL과 실행계획 조합 단위라 단위가 다릅니다.

컬럼 구성​

GroupColumnDescription
SQLsql_id · plan_hash_value · query_textSQL 식별자와 원문
CompositionSteps · Breakdown실행계획 단계 수와 Access Type 구성 막대
PerformanceExecutions · LIO/exec · Elapsed/exec(s)실행 횟수와 실행당 부하

Access Type 컬럼은 위험도에 따라 High Risk·Caution·Normal·Hidden 네 묶음으로 나뉩니다. 표시할 유형은 컬럼 설정에서 고를 수 있고, 정의표에 걸리지 않은 나머지 단계는 Others 컬럼에 모입니다.

기본으로 켜지는 Access Type은 다음과 같습니다.

Access TypeTier
TABLE ACCESS FULLHigh Risk
PARTITION RANGE ALLHigh Risk
INDEX SKIP SCANCaution
INDEX FAST FULL SCANCaution
INDEX FULL SCANCaution
INDEX RANGE SCANNormal
INDEX UNIQUE SCANNormal
TABLE ACCESS BY INDEX ROWIDNormal

TABLE ACCESS STORAGE FULL·BITMAP INDEX·MAT_VIEW ACCESS·HASH JOIN·NESTED LOOPS·MERGE JOIN·FIXED TABLE FULL은 기본으로 숨겨져 있으며 컬럼 설정에서 켤 수 있습니다.

고른 SQL 자세히 보기​

목록에서 행을 선택하면 아래 두 패널이 그 SQL의 내용으로 채워집니다.

Execution Plan​

ColumnDescription
Operation실행계획 단계
Object접근 대상 객체
Cost옵티마이저가 매긴 비용

Object Summary​

ColumnDescription
Object객체 이름
Access Type그 객체를 읽는 방식
Index사용한 인덱스
Cost Share전체 비용에서 차지하는 비중

표는 Cost Share 내림차순으로 먼저 정렬됩니다. 부하에 가장 많이 기여하는 객체가 맨 위에 오도록 한 것이며, 컬럼 헤더를 클릭해 정렬을 바꿀 수 있습니다.

알아 두면 좋은 점​

  • LIO(Logical IO, 논리 읽기)는 SQL 단위로만 실측할 수 있습니다. 단계별로 나눈 값은 제공하지 않으므로 Access Type Summary에는 LIO 기여도 컬럼이 없습니다.

  • 추이 차트에서 Access Type을 여러 개 고르면 겹쳐 그린 값의 합이 전체 막대를 넘을 수 있습니다. 한 SQL이 여러 유형을 함께 쓰기 때문이며, 화면은 막대 밖으로 나가지 않도록 잘라서 표시합니다.

  • 추이 차트의 구간 건수와 목록의 행 수는 몇 건 차이가 날 수 있습니다. 차트는 집계 조회에서 오고 목록은 같은 자료에 시스템·재귀 제외 조건을 더 걸러 낸 결과라, 화면은 사용자가 실제로 대조하는 목록 기준으로 숫자를 맞춥니다.

SQL 상세 정보 확인하기​

SQL 목록에서 query 컬럼 항목을 선택하면 SQL 상세 창이 나타납니다. SQL 쿼리문과 Plan 정보를 확인할 수 있습니다.

SQL 통계 보기→ 버튼을 클릭하면 해당 SQL 쿼리문과 관련한 통계 정보를 확인할 수 있는 SQL 통계로 이동할 수 있습니다.

SQL 상세

  • Runtime Plan: 선택된 SQL 쿼리의 실행 계획과 런타임 정보를 제공합니다. 실행 횟수, 평균 실행 시간, 평균 물리적 읽기 등 세부 정보를 제공합니다.

  • Explain Plan: 옵티마이저가 예측한 실행 계획을 보여줍니다. 비용, 작업, 객체 이름, 카디널리티 등의 정보를 제공합니다.

  • Plan History: 데이터베이스에서 실행된 SQL 쿼리의 실행 계획에 대한 이력을 확인할 수 있습니다.

  • Bind Capture: 데이터베이스에서 실행된 SQL 쿼리에 사용된 바인드 변수를 확인할 수 있습니다. 이를 통해 쿼리 실행의 실제 내용을 확인할 수 있습니다.

    노트

    실시간 실행된 bind 값이 아닌 데이터베이스에 캡처된 값(v$sql_bind_capture)입니다.

  • Trend: 선택한 SQL의 실행 지표 추이를 시계열 차트와 표로 확인할 수 있습니다. 실행 시간, 실행당 평균 지표, 파싱 횟수(total·hard) 등의 변화를 시간 순으로 보여 줍니다.

    노트

    Trend 탭에 표시되는 지표 구성은 Oracle과 Oracle Pro에서 다릅니다.

Bind Capture 값 확인하기​

Bind Capture 탭의 바인드 값은 기본적으로 가려져 있습니다. 주민등록번호나 계좌번호 같은 실제 고객 데이터가 담길 수 있어, 조회 권한만으로는 값을 볼 수 없도록 바꿨습니다.

목록 자체는 파라미터 키 없이 조회합니다. 수집 시각과 변수 이름, 데이터 타입은 민감 정보가 아니기 때문입니다. value 컬럼만 ******로 가려집니다.

ColumnDescription
time수집 시각
last_captured데이터베이스가 바인드 값을 마지막으로 캡처한 시각
name바인드 변수 이름
value바인드 값. 복호화 전에는 ******로 표시
datatype바인드 변수 데이터 타입
child_number자식 커서 번호

값을 확인하려면 다음 순서를 따르세요.

  1. Bind Capture 탭 오른쪽 위의 잠금 버튼을 클릭하세요.

  2. 복호화 키 확인 창이 나타나면 파라미터 키를 입력하세요. 파라미터 키는 에이전트 설치 경로의 paramkey.txt 파일에서 확인할 수 있습니다.

  3. 확인 버튼을 클릭하세요.

키가 맞으면 창이 닫히고 value 컬럼이 실제 값으로 채워집니다. 복호화한 뒤에도 값이 대시(-)로 보이는 행이 있을 수 있는데, 이는 에이전트가 그 변수의 값을 캡처하지 못한 경우입니다. 가려진 상태(******)와 구분하기 위해 표기를 다르게 둔 것입니다.

노트

잠금 버튼이 보이지 않는다면

민감 정보 조회(SECURITY_READ) 권한이 없는 계정에는 잠금 버튼이 나타나지 않습니다. 권한은 프로젝트 관리자에게 문의하세요.

주의

키를 잘못 입력한 경우

「잘못된 파라미터 키 입니다.」 문구와 함께 paramkey.txt를 확인하라는 안내가 입력란 아래에 표시되고, 창은 닫히지 않습니다. 실패 사유를 더 자세히 표시하지 않는 것은 요청에 실린 키 값이 화면에 노출되지 않도록 하기 위해서입니다.

조회 구간 중간에 파라미터 키를 바꾼 적이 있으면 「조회 구간 중 파라미터 키가 변경되어 일부 값은 복호화되지 않았습니다.」 안내와 함께 일부 행만 채워집니다.

복호화 조회는 한 번에 최대 500행을 돌려줍니다. 상한에 닿으면 그보다 많은 값이 잘려 나갔을 수 있습니다.

AI 튜닝 가이드​

AI 튜닝 가이드는 SQL 쿼리, Plan, 통계 정보를 분석하여 성능 문제를 진단하고, 최적화 방안을 제시하는 기능입니다. 개발자와 DBA가 병목 원인을 빠르게 파악하고, 효율적인 SQL로 성능을 개선할 수 있도록 지원합니다.

주의

사용 조건 및 유의 사항

PostgreSQL, MySQL, SQL Server는 Plan 조회가 필수입니다.
Plan을 조회하지 않으면 AI 튜닝 가이드 아이콘이 비활성 AI 튜닝 가이드 아이콘(비활성화) 상태로 표시되며, 기능을 사용할 수 없습니다.

  • AI가 생성하는 결과는 자동 분석에 기반하며, 정확도가 100%는 아님을 유의하시기 바랍니다.
  1. 분석 및 진단할 SQL을 클릭해 SQL 상세 화면으로 이동합니다.

  2. SQL 상세 화면의 오른쪽 아래 AI 튜닝 가이드 아이콘 AI 튜닝 가이드 아이콘을 클릭해 AI 분석을 시작합니다.

  3. AI 분석 결과를 확인합니다.

    결과 항목설명
    쿼리 플랜 및 요약쿼리의 목적과 실행 요약
    - 실행 횟수, 누적 실행 시간, 데이터베이스 전체 부하 비중을 분석해 해당 SQL이 시스템 성능에 미치는 영향 평가
    성능 분석분석 결과를 종합해 성능 점수와 진단 결과 제공
    - CPU 사용률, 디스크 사용률, 캐시 적중률, 대기 시간 등 쿼리 수행 과정의 세부 리소스 사용량을 분석해 병목이 발생한 구간을 시각적으로 보여줌
    발견된 주요 이슈주요 이슈 요약 제공
    최적화 권장 사항이슈에 따른 최적화된 쿼리 제안

Plan Change History​

Plan Change History 탭에서 동일한 SQL ID라도 실행 계획이 변경되면 성능에 영향을 줄 수 있습니다. 옵티마이저에 의해 플랜이 바뀐 경우를 감지하고 모니터링하여, 불필요한 변경을 막고 SQL 성능의 일관성을 유지할 수 있습니다.

  1. 분석 > SQL Plan 분석의 Plan Change Historys 탭으로 이동합니다.

  2. 조회 시간 및 인스턴스를 선택하세요.

  3. 시간과 인스턴스 옵션을 설정하고 검색 아이콘 버튼을 선택하세요.

  4. Plan Change Count 섹션에서 특정 시간대를 선택하면, 선택한 시간의 플랜 변경 목록을 표시합니다.

    • Plan Change Count 섹션: 시간대별 플랜 변경이 일어난 횟수를 확인할 수 있는 막대 그래프 차트

Plan 변경 사항 확인하기​

  1. SQL Plan 분석의 Plan Change Historys 탭의 목록에서 특정 변경 항목을 클릭합니다.

  2. Query 섹션에서 플랜 변경 전과 후의 세부 내용이 표시됩니다. 플랜 차이를 비교해 성능 변화의 원인을 파악할 수 있습니다.

    • Query 섹션에서 오른쪽 상단의 새창보기 아이콘 버튼을 클릭하면 해당 섹션을 새창에서 확인할 수 있습니다.
  3. Query 섹션을 닫으려면 오른쪽 상단의 닫기 아이콘 버튼을 클릭하세요.

조회 결과 필터링하기​

조회 결과를 다음 기준으로 필터링할 수 있습니다.

  • sql_id

  • sql_hash_value

  • after_plan_hash_value

  • before_plan_hash_value

필터 조건 추가하기​

  1. 필터 옵션에서 버튼을 클릭하세요.

  2. 필터 키 항목에서 원하는 필터링 기준을 선택하세요.

    • 선택한 항목의 값이 문자에 해당한다면 포함(파란색), 미포함(빨간색) 조건을 선택할 수 있습니다.

      example

    • 선택한 항목의 값이 숫자에 해당한다면 ==(같음), >=(보다 크거나 같음), <=(보다 작거나 같음) 조건을 선택할 수 있습니다.

  3. 조건 항목에서 조건을 선택하세요.

  4. 조건과 일치시킬 문자열 또는 숫자를 입력하세요.

  5. 적용 버튼을 선택하세요.

노트

필터 조건 추가 및 삭제

  • 필터링 조건을 추가하려면 추가 버튼을 클릭하고, 1 ~ 5의 과정을 반복하세요. 추가한 조건은 AND(&&) 조건으로 적용됩니다.

  • 조건 추가 중 일부 항목을 삭제하려면 필터 조건 오른쪽에 삭제 아이콘 버튼을 클릭하세요. 전체 조건을 삭제하려면 삭제 아이콘 전체 삭제 버튼을 클릭하세요.

  • 필터 옵션에 적용된 조건을 빠르게 삭제하려면 버튼을 클릭하세요.

필터 조건 수정하기​

  1. 화면 상단 필터 옵션에 적용된 항목을 클릭하세요.

  2. 필터 수정하기 창에서 원하는 항목을 수정한 후, 적용 버튼을 클릭하세요.