DBMS_SQLDIAG.REPORT_SQL 함수

2025. 1. 23.·Oracle/Performance

Oracle 23ai에 DBMS_SQLDIAG.REPORT_SQL 함수가 추가되었습니다. 이 함수는 SQL 문에 대한 정보를 포함한 리포트를 HTML 형식을 반환합니다.

 

DBMS_SQLDIAG.REPORT_SQL 함수의 정의는 아래와 같습니다. directory에 값을 입력하면 디렉토리에 SQLR_<SQL_ID>_<YYYYMMDDHH24MI>.html 형식의 파일이 생성됩니다.

DBMS_SQLDIAG.REPORT_SQL (
    sql_id    IN VARCHAR2
  , directory IN VARCHAR2 DEFAULT NULL
  , level     IN VARCHAR2 DEFAULT 'TYPICAL' -- BASIC, TYPICAL, ALL
)
    RETURN CLOB;

 

테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다.

-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 500, 'X') FROM XMLTABLE ('1 to 10000');
CREATE INDEX t1_x1 ON t1 (c1);

 

아래와 같이 SQL 문을 수행하겠습니다.

-- 2
VAR b1 NUMBER = 100

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM t1 WHERE c1 <= :b1;

SQL_ID  859pscyvz1grs, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM t1 WHERE c1 <= :b1

Plan hash value: 711837727

------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name  | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |       |      1 |        |       |     9 (100)|          |    100 |00:00:00.01 |      12 |      1 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T1    |      1 |   3002 |   776K|     9   (0)| 00:00:01 |    100 |00:00:00.01 |      12 |      1 |
|*  2 |   INDEX RANGE SCAN                  | T1_X1 |      1 |    540 |       |     2   (0)| 00:00:01 |    100 |00:00:00.01 |       3 |      1 |
------------------------------------------------------------------------------------------------------------------------------------------------

 

DBMS_SQLDIAG.REPORT_SQL 함수는 쿼리에 사용할 수 없습니다.

-- 3
SELECT DBMS_SQLDIAG.REPORT_SQL (sql_id => '859pscyvz1grs');

ORA-14551: cannot perform a DML operation inside a query

 

아래와 같이 SQL 리포트를 생성할 수 있습니다.

-- 4
VAR b_report CLOB;
EXEC :b_report := DBMS_SQLDIAG.REPORT_SQL (sql_id => '859pscyvz1grs', level => 'ALL');

SET FEEDBACK      OFF
SET LINESIZE      32767
SET LONG          1000000
SET LONGCHUNKSIZE 1000000
SET PAGESIZE      0
SET TIMING        OFF
SET TRIMOUT       ON
SET TRIMSPOOL     ON 

SPOOL SQLR.html
SELECT :b_report AS report FROM DUAL;
SPOOL OFF

 

아래는 생성된 리포트입니다.

SQLR.html
0.11MB

 

관련 링크

  • Oracle Blog - Diagnose SQL performance with DBMS_SQLDIAG

 

[2025-07-30]

해당 기능이 Oracle 19.28 버전으로 백포트되었습니다.

저작자표시 비영리 변경금지 (새창열림)
'Oracle/Performance' 카테고리의 다른 글
  • DBMS_SHARED_POOL.MARKHOT
  • Dynamic Statistics for PL/SQL Functions
  • NL 조인의 비용 계산
  • MBRC 설정에 따른 multiblock read 동작
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 관심을 가져왔습니다. 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며 Oracle 사의 공식적인 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (206)
      • Oracle (177)
        • SQL (36)
        • PLSQL (10)
        • Performance (75)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (7)
      • Exadata (16)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
DBMS_SQLDIAG.REPORT_SQL 함수
상단으로

티스토리툴바