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性能问题。

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

  1. 使用步骤​
bash 复制代码
--解压缩
 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>

参数说明​:

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

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

bash 复制代码
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
bash 复制代码
-- 使用示例中的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
bash 复制代码
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快照(否则报告无数据):
bash 复制代码
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();

输出解读​:

  • 报告文件命名:sqlhc_<日期><时间>.zip
  • 核心文件:*_main.html(汇总问题与建议)
相关推荐
致Great4 小时前
MCP出现的意义是什么?让 AI 智能体更模块化
大数据·人工智能·rag
ZHOU_WUYI4 小时前
Python Minio库连接和操作Minio数据库
数据库·ragflow
安 当 加 密4 小时前
如何通过密钥管理系统实现数据库、操作系统账号和密码的安全管理
网络·数据库·安全
nbsaas-boot5 小时前
基于存储过程的MySQL自动化DDL同步系统设计
数据库·mysql·自动化
摇一摇小肉包的JAVA笔记5 小时前
Redis如何解决缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
wsdchong之小马过河5 小时前
2025虚幻引擎文件与文件夹命名规律
java·数据库·虚幻
唐人街都是苦瓜脸5 小时前
学习Oracle------高可用架构解析
学习·oracle·架构
金融小师妹6 小时前
基于LSTM-GARCH混合模型的“获利了结”量化解析:黄金单日1.27%跌幅的技术性归因
大数据·人工智能·算法
东方-教育技术博主6 小时前
spring boot数据库注解
数据库·spring boot·oracle