暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

告别盲调!SQLHC让低效SQL无所遁形,Oracle调优效率提升80%

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。

关注公众号,技术道路不迷路

 

一、什么是 SQLHC

SQLHC(SQL Tuning Health-Check)是 Oracle Server 技术专家中心开发的 SQL 调优工具,核心功能是检查单个 SQL 语句的运行环境,涵盖基于成本的优化器(CBO)统计数据、模式对象元数据、配置参数等可能影响 SQL 性能的关键元素。

二、SQLHC 的授权说明

SQLHC 无需额外许可证,可免费使用。若系统已安装诊断包(Diagnostic)或调整包(Tuning pack),SQLHC 可调用 AWR 报告信息辅助分析,因此执行时会询问站点是否已获得这两个包的授权。

三、SQLHC 的核心目的

保障单个 SQL 的运行环境合规,帮助用户规避 “可避免的 SQL 性能问题”;
具备 “无数据库足迹” 特性,可在所有数据库系统上安全运行,不产生额外数据残留;
对指定 SQL_ID 执行后,生成 HTML 格式报告,呈现该 SQL 的完整健康检查结果。
(注:SQL_ID 可从 AWR/ASH 报告获取,或通过 V$SQL 视图查询数据库中的有效 SQL_ID。)

四、SQLHC 的健康检查范围

脚本围绕以下 5 个维度开展健康检查:
被分析 SQL 访问的模式对象的 CBO 统计信息;
CBO 参数配置合理性;
CBO 系统统计数据完整性;
CBO 数据字典统计数据有效性;
CBO 固定对象统计数据准确性。

五、SQLHC 的使用最佳实践

核心原则:主动规避问题 + 及时收集诊断信息
多数 SQL 性能问题若及早发现迹象(如统计数据异常),可提前规避;
问题发生后再收集诊断信息无实际意义,SQLHC 是 Oracle 推荐的 “事前诊断 + 问题预防” 工具之一。

六、SQLHC 的使用必要条件

执行身份:需以 SYS、DBA 或拥有 “数据字典视图访问权限” 的用户身份操作;
执行环境:通过 SQL*Plus 连接数据库执行脚本;
安全性:脚本不向数据库添加任何对象,仅对现有对象生成报告与优化建议。

七、SQLHC 的详细操作步骤

环境配置:登录数据库服务器,完成数据库实例的运行环境配置;
脚本执行:通过 SQL*Plus 连接数据库(使用 SYS/DBA 或有权限用户),执行 “sqlhc.sql” 脚本,并按提示输入两个必需参数:
① Oracle 包许可证类型:输入 [T|D|N](T=Tuning 包,含 Diagnostics 包;D=Diagnostics 包;N = 无授权);
② 待分析 SQL 的有效 SQL_ID。请注意,SQL_ID不能是PL/SQL包的SQL_ID。这不会产生任何有用的结果。此routine一次只对一个SQL_ID运行。您不能将一系列SQL_ID语句用作参数列表。

1、下载 “sqlhc.zip” 压缩包,解压至服务器合适目录

[oracle@myoracle ~]$ unzip sqlhc.zip
[oracle@myoracle ~]$ ls -lrth sqlhc
[oracle@myoracle ~]$ chmod -R 777 sqlhc


2、查找耗时最长的SQL_ID(含执行时长)
SQL>SELECT sql_id, 
       sql_text, 
       elapsed_time/1000000 AS total_elapsed_sec,
       executions,
       (elapsed_time/1000000)/executions AS avg_elapsed_sec
FROM v$sql
WHERE executions > 0
ORDER BY avg_elapsed_sec DESC
FETCH FIRST 10 ROWS ONLY;

3、执行收集命令

SQL>START home/oracle/sqlhc/sqlhc.sql "T" 9yv5dwv8k0awg


4、查看生成的文件
[oracle@myoracle ~]$ ls -l sqlhc_20251202_1645_9yv5dwv8k0awg.zip

5、下载后解压

6、查看报告

 

执行完成后生成sqlhc_<时间戳>_.zip压缩包,包含多个HTML报告和日志文件。

解压报告压缩包后,重点关注以下文件:

1. 主报告(_1_main.html)
统计信息检查;
参数配置;
执行计划建议。
2. 执行计划报告(_3_execution_plans.html)
可视化展示执行计划,标记高成本操作(如大表JOIN的哈希连接成本过高)。
对比历史计划(若存在),分析计划变更是否导致性能下降。
3. AWR报告(_12_awr.zip)
提取该SQL的历史性能数据,如逻辑读(buffer gets)、执行时间、等待事件(如db file sequential read)。
定位性能波动时段,结合系统负载分析瓶颈。

 









AWR报告也有

八、Oracle查找/定位SQL_ID的核心方法

方法1:从vsqlarea视图查询(最常用)

适用于已知SQL片段、表名、执行用户等信息的场景,示例SQL:

-- 按SQL片段模糊查询(替换成你的关键词)
SELECT sql_id, sql_text, elapsed_time/1000000AS elapsed_sec
FROM v$sql
WHERE sql_text LIKE'%EMPLOYEE%'
AND sql_text NOTLIKE'%v$sql%'-- 排除查询本身
ORDERBY elapsed_sec DESC;

-- 按执行用户查询
SELECT sql_id, sql_text, username
FROM v$sql s, dba_users u
WHERE s.parsing_user_id = u.user_id
AND u.username ='SCOTT';

方法2:从v$session定位当前执行的SQL_ID

适用于定位会话中正在运行的SQL,示例:

-- 查找指定用户的当前执行SQL_ID
SELECT s.sid, s.serial#, s.sql_id, sq.sql_text
FROM v$session s
LEFTJOIN v$sql sq ON s.sql_id = sq.sql_id
WHERE s.username ='SCOTT'
AND s.status ='ACTIVE';

-- 查找耗时最长的SQL_ID(含执行时长)
SELECT sql_id, 
       sql_text, 
       elapsed_time/1000000AS total_elapsed_sec,
       executions,
       (elapsed_time/1000000)/executions AS avg_elapsed_sec
FROM v$sql
WHERE executions >0
ORDERBY avg_elapsed_sec DESC
FETCHFIRST10ROWSONLY;

方法3:从AWR报告/ASH视图查找历史SQL_ID

适用于定位已执行完成的历史慢SQL:

-- 从ASH视图(活跃会话历史)查SQL_ID
SELECT sql_id, 
       COUNT(*) AS exec_count,
       MAX(elapsed_time/1000000) AS max_elapsed_sec
FROM v$active_session_history
WHERE sample_time BETWEEN TO_DATE('2025-12-01 00:00:00','YYYY-MM-DD HH24:MI:SS') 
                      AND TO_DATE('2025-12-02 00:00:00','YYYY-MM-DD HH24:MI:SS')
GROUP BY sql_id
ORDER BY exec_count DESC;

-- 生成AWR报告(通过awrrpt.sql脚本)
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
-- 执行后按提示选择时间范围,报告中会列出Top SQL及对应的SQL_ID

方法4:从应用端/日志提取SQL_ID

如果应用程序执行SQL时记录了日志,可直接从日志中抓取;或在应用执行SQL前,通过以下方式获取:

-- 执行SQL前先开启跟踪,获取SQL_ID
ALTER SESSION SET sql_trace = TRUE;
-- 执行目标SQL(如:SELECT * FROM EMP WHERE DEPTNO=10;)
-- 查看跟踪文件或执行以下语句获取刚执行的SQL_ID
SELECT sql_id, sql_text FROM v$sql WHERE sql_text LIKE '%EMP WHERE DEPTNO=10%';

九、获取工具

微信公号号后台回复SQLHC,获取工具。

 


END
往期文章回顾

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论