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(匯總問題與建議)