SQLHC(SQL Health Check)作为 Oracle 数据库性能诊断的核心工具,其设计理念和核心功能在 Oracle 各版本中保持高度一致,但在技术实现和周边生态上存在渐进式优化。定期对关键业务 SQL 执行健康检查,特别是在版本升级或统计信息变更后。
一、SQLHC(SQL Tuning Health-Check Script)的功能和技术
1. 功能:
- 被分析的SQL语句访问的模式对象的CBO统计信息。
- CBO参数。
- CBO系统统计。
- CBO数据字典统计。
- CBO固定对象统计。
2. 技术原理:
- 收集环境信息:SQLHC通过查询数据字典和动态性能视图,收集与SQL执行相关的环境信息,包括数据库版本、参数设置、系统统计信息等。
- 分析SQL执行计划:获取指定SQL_ID的执行计划,并分析其执行计划是否合理,是否存在性能问题。
- 检查统计信息:验证相关表、索引、列的统计信息是否最新和准确,以及是否存在缺失或过时的统计信息。
- 检查参数设置:验证影响优化器行为的参数设置是否合理,如optimizer_mode、optimizer_index_cost_adj等。
- 生成报告:将收集的信息和分析结果汇总生成HTML报告,便于用户查看。
3. 报告解析
- 诊断包集成:当启用 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 01,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_text2 FROM v$sql3* 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.04SYS@FREE> @/home/oracle/sqlhc/sqlhc.sql "T" 0npm6czzaj44mParameter 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.sqlSession altered.Running in SQL_ID modeSession altered.INPUT_SQL_ID
-------------
0npm6czzaj44mValues passed:
License: "T"
Mode : "SQL ID mode"
SQL_ID : "0npm6czzaj44m"DBID
----------
1475650002SQL_ID
-------------
0npm6czzaj44mPL/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.zipArchive: sqlhc_20250620_1820_0npm6czzaj44m.zipLength Date Time Name
--------- ---------- ----- ----951447 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_1_main.html11946 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_3_execution_plans.html16311 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_4_sql_detail.html26361 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_9_log.zip1326 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_10_sql_tuning_advisor.out178280 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_6_10053_trace_from_cursor.trc574 06-20-2025 18:24 sqlhc_20250620_1820_0npm6czzaj44m_11_tcb.zip438049 06-20-2025 18:25 sqlhc_20250620_1820_0npm6czzaj44m_12_awr.zip3213 06-20-2025 18:25 sqlhc_20250620_1820_0npm6czzaj44m_7_driver.zip147 06-20-2025 18:23 sqlhc_20250620_1820_0npm6czzaj44m_2_startup_history.txt351816 06-20-2025 18:26 sqlhc_20250620_1820_0npm6czzaj44m_8_sqldx.zip
--------- -------1979470 11 filesSQL>
四、sqlhc注意事项
SQL_ID限制:
- 不支持PL/SQL包内的SQL。
- 一次仅能分析一个SQL_ID。
许可要求:
- Tuning/Diagnostics Pack非必需,但启用后可获取AWR深度分析。
前置条件:
- 需在SQL执行前后生成AWR快照(否则报告无数据):
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
输出解读:
- 报告文件命名:sqlhc_<日期>_<时间>_.zip
- 核心文件:*_main.html(汇总问题与建议)