云计算百科
云计算领域专业知识百科平台

53-Oracle sqlhc多版本实操含(23 ai)

SQLHC(SQL Health Check)作为 Oracle 数据库性能诊断的核心工具,其设计理念和核心功能在 Oracle 各版本中保持高度一致,但在技术实现和周边生态上存在渐进式优化。定期对关键业务 SQL 执行健康检查,特别是在版本升级或统计信息变更后。

一、SQLHC(SQL Tuning Health-Check Script)的功能和技术

1. 功能:

SQLHC(SQL Tuning Health-Check Script)是Oracle提供的一个用于检查单个SQL语句运行环境的健康检查工具。它收集与SQL性能相关的各种信息,诊断SQL性能问题。

  • 被分析的SQL语句访问的模式对象的CBO统计信息。
  • CBO参数。
  • CBO系统统计。
  • CBO数据字典统计。
  • CBO固定对象统计。
  • 2. 技术原理:
  • 收集环境信息:SQLHC通过查询数据字典和动态性能视图,收集与SQL执行相关的环境信息,包括数据库版本、参数设置、系统统计信息等。
  • 分析SQL执行计划:获取指定SQL_ID的执行计划,并分析其执行计划是否合理,是否存在性能问题。
  • 检查统计信息:验证相关表、索引、列的统计信息是否最新和准确,以及是否存在缺失或过时的统计信息。
  • 检查参数设置:验证影响优化器行为的参数设置是否合理,如optimizer_mode、optimizer_index_cost_adj等。
  • 生成报告:将收集的信息和分析结果汇总生成HTML报告,便于用户查看。
  • 3. 报告解析

    通过动态采集以下关键数据生成 HTML 报告:

    关键技术点​:

    • ​诊断包集成​:当启用 Tuning Pack 或 Diagnostics Pack 时,自动整合 AWR/ASH 数据
    • ​动态采样​:实时获取执行计划、10053 跟踪文件
    • ​环境快照​:记录 SQL 运行时的数据库配置状态

    二、SQLHC 在 Oracle 各版本中的演进

    版本 演进重点 技术特点 兼容性说明

    Oracle 10g 初始版本发布 基于 SQL 脚本集("sqlhc.sql"),无数据库痕迹(Rollback 机制) 仅支持 10g+(依赖 SQL_ID 机制)

    Oracle 11g/12c 增强 AWR 集成 支持诊断包(Diagnostics Pack)获取历史执行计划,优化统计信息收集逻辑 脚本通用,无版本差异

    Oracle 19c 容器数据库(CDB/PDB)支持 可针对 PDB 运行,输出报告包含多租户环境信息 脚本与 11g/12c 完全相同

    Oracle 23ai 生态工具升级核心 SQLHC进化,23ai 全系列版本兼容,适配23ai新特性,仍是官方推荐的SQL诊断工具

    三、各版本实操

    1. 通用 SQLHC 诊断(全版本适用)

    # 下载脚本并解压 unzip sqlhc.zip ,sql中记得找到对应的路径

     2. 使用步骤​

    –解压缩
    unzip sqlhc.zip
    [oracle@rac11 ~]$ ls -lrht
    total 2.0M
    -rw-r–r– 1 oracle oinstall 2.6K Sep 19 2024 tbs.sql
    -rw-r–r– 1 oracle oinstall 263 Sep 26 2024 history.log
    -rw-r–r– 1 oracle oinstall 34 Oct 10 2024 wyxx.j
    dr-xr-xr-x 3 oracle oinstall 4.0K Feb 23 17:01 sqlhc
    -rw-r–r– 1 oracle oinstall 1.5M Jun 19 20:49 pdbrs6-20250619-7-9AM.html
    -rw-r–r– 1 oracle oinstall 83K Jun 20 10:45 RAC-PDBRS6-20250620.txt
    -rw-r–r– 1 root root 223K Jun 20 17:21 sqlhc.zip
    -rw-r–r– 1 root root 171K Jun 20 17:21 sqlhc11g.zip
    [oracle@rac11 ~]$ cd sqlhc/
    [oracle@rac11 sqlhc]$ pwd
    /home/oracle/sqlhc
    [oracle@rac11 sqlhc]$ ls -lrht
    total 880K
    -rw-r–r– 1 oracle oinstall 545 Oct 9 2024 sqlhc_pxhcdr_null.sql
    -rw-r–r– 1 oracle oinstall 2.3K Oct 9 2024 sqlhc_tcb.sql
    -rw-r–r– 1 oracle oinstall 48K Oct 10 2024 sqldx.sql
    -rw-r–r– 1 oracle oinstall 510 Oct 10 2024 sqlhc_db_null.sql
    -rw-r–r– 1 oracle oinstall 328K Oct 10 2024 sqlhc_db.sql
    -rw-r–r– 1 oracle oinstall 491 Oct 10 2024 sqlhc_exit.sql
    -rw-r–r– 1 oracle oinstall 75K Oct 10 2024 sqlhc_pxhcdr.sql
    -rw-r–r– 1 oracle oinstall 4.4K Oct 10 2024 sqlhc_sta.sql
    -rw-r–r– 1 oracle oinstall 60K Oct 10 2024 util_planx.sql
    dr-xr-xr-x 4 oracle oinstall 4.0K Feb 23 17:00 utl
    -rw-r–r– 1 oracle oinstall 337K Feb 23 17:03 sqlhc.sql

    — 以DBA身份连接
    sqlplus / as sysdba

    — 执行SQLHC脚本(需提前下载解压)
    START /path/to/sqlhc.sql "T" <SQL_ID>

    参数说明​:

  •  "T":启用Tuning Pack(含Diagnostics)
  •  "D":仅启用Diagnostics Pack
  •  "N":无许可包
  •  :目标SQL的ID(从V$SQL或AWR报告中获取)
  • 2.默认是已经开启了awr的收集,如无请开启

    手动生成AWR快照,AWR报告中的sql id需要使用

    EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

    –查询数据
    SELECT /* SQLHC_20250620*/ * from his50.tbl_Clinic where 1=1 order by dRegisterDate;

    00000003021657391315 0000000302 姜** 1 53 20-JUN-25 20-JUN-25 5301 0
    170606 20250620000514 孙** 1 32 20-JUN-25 20-JUN-25 MR MR 0
    170713 20250620000515 杨** 1 67 20-JUN-25 20-JUN-25 MR MR 0
    170747 20250620000516 杨** 1 67 20-JUN-25 20-JUN-25 MR MR 0

    1,472 rows selected.
    –再次收集awr
    EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
    –找寻SQL_ID
    SELECT sql_id, plan_hash_value, substr(sql_text,1,40) sql_text
    FROM v$sql
    WHERE sql_text like 'SELECT /* SQLHC_20250620*/%';

    SQL> SELECT sql_id, plan_hash_value, substr(sql_text,1,40) sql_text
    2 FROM v$sql
    3* WHERE sql_text like 'SELECT /* SQLHC_20250620*/%';

    SQL_ID PLAN_HASH_VALUE SQL_TEXT
    ________________ __________________ ___________________________________________
    78mdr2csmpkrr 1293871107 SELECT /* SQLHC_20250620*/ * from his50.

     3. Oracle 11g​/19C

    — 使用示例中的SQL_ID 78mdr2csmpkrr
    –START /home/oracle/sqlhc.sql "T" <SQL_ID>
    START /home/oracle/sqlhc/sqlhc.sql "T" 78mdr2csmpkrr

    Archive: sqlhc_20250620_1728_78mdr2csmpkrr.zip

    4. 23ai

    Connected to:
    Oracle Database 23ai Free Release 23.0.0.0.0 – Develop, Learn, and Run for Free
    Version 23.8.0.25.04

    SYS@FREE> @/home/oracle/sqlhc/sqlhc.sql "T" 0npm6czzaj44m

    Parameter 1:
    Oracle Pack License (Tuning, Diagnostics or None) [T|D|N] (required)

    PL/SQL procedure successfully completed.

    Parameter 2:
    SQL_ID of the SQL to be analyzed (required) or press RETURN to get
    DB only mode (only non-SQL_ID report).

    PL/SQL procedure successfully completed.

    DB_SCRIPT
    ————————————————————————————————————————
    sqlhc_db_null.sql

    Session altered.

    Running in SQL_ID mode

    Session altered.

    INPUT_SQL_ID
    ————-
    0npm6czzaj44m

    Values passed:
    License: "T"
    Mode : "SQL ID mode"
    SQL_ID : "0npm6czzaj44m"

    DBID
    ———-
    1475650002

    SQL_ID
    ————-
    0npm6czzaj44m

    PL/SQL procedure successfully completed.

    PL/SQL procedure successfully completed.

    SYS@FREE>
    SYS@FREE> /**************************************************************************************************
    SYS@FREE> *
    SYS@FREE> * begin_common: from begin_common to end_common sqlhc.sql and sqlhcxec.sql are identical
    SYS@FREE> *
    SYS@FREE> **************************************************************************************************/
    SYS@FREE> SELECT 'BEGIN: '||TO_CHAR(SYSDATE, 'YYYY-MM-DD/HH24:MI:SS') FROM dual;

    'BEGIN:'||TO_CHAR(SYSDATE,

    ……………………

    adding: sqlhc_20250620_1820_0npm6czzaj44m_2_startup_history.txt (deflated 55%)

    Parameter 1:
    Oracle Pack License (Tuning or Diagnostics) [T|D] (required)

    Parameter 2:
    Output Type (HTML or CSV or Both) [H|C|B] (required)

    Parameter 3:
    SQL_ID of the SQL to be analyzed (required)

    Values passed:
    License: "T"
    Output : "CSV"
    SQL_ID : "0npm6czzaj44m"

    ### … getting SQL text …

    ### … getting signature …

    ### … getting tables …

    ### … generating dynamic script, please wait …

    Session altered.

    adding: sqlhc_20250620_1820_0npm6czzaj44m_8_sqldx.zip (stored 0%)

    SQLDX files have been added to sqlhc_20250620_1820_0npm6czzaj44m.zip

    Archive: sqlhc_20250620_1820_0npm6czzaj44m.zip
    Length Date Time Name
    ——— ———- —– —-
    951447 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_1_main.html
    11946 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_3_execution_plans.html
    16311 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_4_sql_detail.html
    26361 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_9_log.zip
    1326 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_10_sql_tuning_advisor.out
    178280 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_6_10053_trace_from_cursor.trc
    574 06-20-2025 18:24 sqlhc_20250620_1820_0npm6czzaj44m_11_tcb.zip
    438049 06-20-2025 18:25 sqlhc_20250620_1820_0npm6czzaj44m_12_awr.zip
    3213 06-20-2025 18:25 sqlhc_20250620_1820_0npm6czzaj44m_7_driver.zip
    147 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_2_startup_history.txt
    351816 06-20-2025 18:26 sqlhc_20250620_1820_0npm6czzaj44m_8_sqldx.zip
    ——— ——-
    1979470 11 files

    SQL>

    四、sqlhc注意事项​

    SQL_ID限制​:

    • 不支持PL/SQL包内的SQL。
    • 一次仅能分析一个SQL_ID。

    许可要求​:

    • Tuning/Diagnostics Pack非必需,但启用后可获取AWR深度分析。

    ​前置条件​:

    • 需在SQL执行前后生成AWR快照(否则报告无数据):

    EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

    输出解读​:

    • 报告文件命名:sqlhc_<日期>_<时间>_.zip
    • 核心文件:*_main.html(汇总问题与建议)
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 53-Oracle sqlhc多版本实操含(23 ai)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!