分享一个比SQLHC还要厉害的脚本

news/2025/11/11 9:34:41/文章来源:https://www.cnblogs.com/liuziyi1/p/19209056

分享一个比SQLHC还要厉害的脚本

分享一个比SQLHC还要厉害的脚本,直接在oracle用户下执行即可。

-- File Name : SQLHC.sqlALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD';
SET SERVEROUTPUT ON SIZE UNLIMITED
SET LINESIZE 200
SET PAGESIZE 1000
SET VERIFY OFF
SET FEEDBACK OFF
SET TRIMSPOOL ON
SET ECHO OFF-- 定义版本控制和配置
DEFINE _SQL_MONITOR = "  "
DEFINE _VERSION_11  = "--"
DEFINE _VERSION_12  = "--" 
DEFINE _VERSION_10  = "--"
DEFINE _CDB_MODE    = "--"-- 版本检测
COL pdbname    NOPRINT NEW_VALUE _PDBNAME
COL version12  NOPRINT NEW_VALUE _VERSION_12  
COL version11  NOPRINT NEW_VALUE _VERSION_11
COL version10  NOPRINT NEW_VALUE _VERSION_10SELECT CASE WHEN version >= '12.1' THEN '  ' ELSE '--' END version12,CASE WHEN version >= '11.2' THEN '  ' ELSE '--' END version11,CASE WHEN version >= '10.2' AND version < '11.2' THEN '  ' ELSE '--' END version10
FROM (SELECT TO_NUMBER(SUBSTR(banner, INSTR(banner, 'Release ')+8, INSTR(SUBSTR(banner, INSTR(banner, 'Release ')+8), '.')-1)) versionFROM v$version WHERE banner LIKE 'Oracle Database%'AND ROWNUM = 1
);-- 动态生成输出文件名
COLUMN output_file NEW_VALUE output_file NOPRINT
SELECT 'sql_optimize_' || LOWER((SELECT instance_name FROM v$instance)) || '_' ||'&&sqlid' || '_' ||TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') || '.log' AS output_file
FROM DUAL;SPOOL &output_filePROMPT ================================================================================
PROMPT SQL Optimizer Report - &&sqlid
PROMPT Generated: &_DATE
PROMPT Instance: &_INSTANCE_NAME  
PROMPT ================================================================================UNDEFINE sqlid
ACCEPT sqlid CHAR PROMPT 'Enter SQL_ID: '-- 格式定义
COL CPU_TIME                HEADING "CPU|TIME"           FOR 999999,999,999
COL ELAPSED_TIME            HEADING "ELAPSED|TIME"       FOR 999999,999,999
COL DISK_READS              HEADING "DISK|READS"         FOR 999999,999,999
COL BUFFER_GETS             HEADING "BUFFER|GETS"        FOR 999999,999,999
COL PLAN_HASH_VALUE         HEADING "PLAN|HASH VALUE"    FOR 999999999999
COL PARSING_SCHEMA_NAME     HEADING "SCHEMA"             FOR A15
COL CHILD_NUMBER            HEADING "CHILD"              FOR 999
COL EXECUTIONS              HEADING "EXECS"              FOR 999,999,999
COL ROWS_PROCESSED          HEADING "ROWS"               FOR 999,999,999PROMPT
PROMPT ****************************************************************************************
PROMPT 1. LITERAL SQL WITH BIND VARIABLES
PROMPT ****************************************************************************************DECLARECURSOR c_binds ISSELECT DISTINCT child_numberFROM v$sql_bind_capture WHERE sql_id = '&&sqlid'ORDER BY child_number;CURSOR c_bind_details(p_child NUMBER) ISSELECT name, position, datatype_string, value_stringFROM v$sql_bind_captureWHERE sql_id = '&&sqlid' AND child_number = p_childORDER BY position;lv_sql_text      VARCHAR2(32767);lv_final_sql     VARCHAR2(32767);lv_parsing_schema VARCHAR2(30);ln_bind_count    NUMBER;
BEGIN-- 检查绑定变量是否存在SELECT COUNT(*) INTO ln_bind_count FROM v$sql_bind_capture WHERE sql_id = '&&sqlid' AND ROWNUM = 1;-- 获取原始SQL文本BEGINSELECT sql_text, parsing_schema_name INTO lv_sql_text, lv_parsing_schemaFROM v$sql WHERE sql_id = '&&sqlid' AND ROWNUM = 1;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('ERROR: SQL_ID &&sqlid not found in shared pool');RETURN;END;IF ln_bind_count = 0 THENDBMS_OUTPUT.PUT_LINE('Schema: ' || lv_parsing_schema);DBMS_OUTPUT.PUT_LINE(lv_sql_text);DBMS_OUTPUT.PUT_LINE('--- No bind variables found ---');RETURN;END IF;-- 处理每个child cursor的绑定变量FOR r_child IN c_binds LOOPBEGINSELECT sql_text, parsing_schema_name INTO lv_sql_text, lv_parsing_schemaFROM v$sql WHERE sql_id = '&&sqlid' AND child_number = r_child.child_numberAND ROWNUM = 1;lv_final_sql := lv_sql_text;-- 替换绑定变量FOR r_bind IN c_bind_details(r_child.child_number) LOOPlv_final_sql := REPLACE(lv_final_sql, r_bind.name,CASE WHEN r_bind.value_string IS NULL THEN 'NULL'WHEN r_bind.datatype_string = 'NUMBER' THEN r_bind.value_stringELSE '''' || REPLACE(r_bind.value_string, '''', '''''') || ''''END);END LOOP;DBMS_OUTPUT.PUT_LINE('Child: ' || r_child.child_number || ', Schema: ' || lv_parsing_schema);DBMS_OUTPUT.PUT_LINE(lv_final_sql);DBMS_OUTPUT.PUT_LINE('--------------------------------------------------------');EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('Child ' || r_child.child_number || ' not found');END;END LOOP;
EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Unexpected error: ' || SQLERRM);
END;
/PROMPT
PROMPT ****************************************************************************************
PROMPT 2. EXECUTION PLANS
PROMPT ****************************************************************************************PROMPT
PROMPT 2.1 Current Cursor Plan:
PROMPT =======================SELECT t.*
FROM v$sql s,TABLE(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number, 'ADVANCED ALLSTATS LAST')) t
WHERE s.sql_id = '&&sqlid'
AND ROWNUM = 1;PROMPT
PROMPT 2.2 AWR Plan (if available):
PROMPT ===========================
-- SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&&sqlid',NULL,NULL,'ADVANCED ALLSTATS LAST'));PROMPT
PROMPT ****************************************************************************************
PROMPT 3. SQL PERFORMANCE STATISTICS
PROMPT ****************************************************************************************PROMPT
PROMPT 3.1 From V$SQLAREA (Aggregated):
PROMPT ================================SELECT plan_hash_value,executions,ROUND(cpu_time/1000000, 2) || 's' as cpu_time,ROUND(elapsed_time/1000000, 2) || 's' as elapsed_time, buffer_gets,disk_reads,rows_processed,sql_profile,parsing_schema_name
FROM v$sqlarea 
WHERE sql_id = '&&sqlid';PROMPT
PROMPT 3.2 From V$SQL (By Child Cursor):
PROMPT ==================================SELECT child_number,plan_hash_value, executions,ROUND(cpu_time/1000000/NULLIF(executions,0), 4) || 's' as cpu_per_exec,ROUND(elapsed_time/1000000/NULLIF(executions,0), 4) || 's' as elapsed_per_exec,ROUND(buffer_gets/NULLIF(executions,0), 2) as gets_per_exec,ROUND(disk_reads/NULLIF(executions,0), 2) as reads_per_exec,ROUND(rows_processed/NULLIF(executions,0), 2) as rows_per_exec
FROM v$sql 
WHERE sql_id = '&&sqlid'
ORDER BY child_number;PROMPT
PROMPT 3.3 From AWR History (Last 7 days):
PROMPT ====================================SELECT TO_CHAR(end_interval_time, 'MM-DD HH24:MI') as snapshot_time,plan_hash_value,executions_delta as executions,ROUND(elapsed_time_delta/1000000/NULLIF(executions_delta,0), 4) || 's' as ela_per_exec,ROUND(buffer_gets_delta/NULLIF(executions_delta,0), 2) as gets_per_exec,ROUND(disk_reads_delta/NULLIF(executions_delta,0), 2) as reads_per_exec
FROM dba_hist_sqlstat ss, dba_hist_snapshot sn
WHERE ss.sql_id = '&&sqlid'
AND ss.snap_id = sn.snap_id
AND ss.instance_number = sn.instance_number
AND end_interval_time > SYSDATE - 7
ORDER BY end_interval_time DESC;PROMPT
PROMPT ****************************************************************************************
PROMPT 4. SQL MONITOR REPORT (11g+)
PROMPT ****************************************************************************************&_VERSION_11 SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
&_VERSION_11    sql_id => '&&sqlid',
&_VERSION_11    type => 'TEXT',
&_VERSION_11    report_level => 'BASIC') as monitor_report
&_VERSION_11 FROM DUAL;PROMPT
PROMPT ****************************************************************************************
PROMPT 5. WAIT EVENTS ANALYSIS
PROMPT ****************************************************************************************SELECT event,wait_class,COUNT(*) as total_samples,ROUND(COUNT(*) * 100 / SUM(COUNT(*)) OVER (), 2) as pct
FROM v$active_session_history
WHERE sql_id = '&&sqlid'
AND sample_time > SYSDATE - 1/24  -- Last 1 hour
GROUP BY event, wait_class
ORDER BY total_samples DESC
FETCH FIRST 10 ROWS ONLY;PROMPT
PROMPT ****************************************************************************************
PROMPT 6. ACCESSED OBJECTS INFORMATION
PROMPT ****************************************************************************************WITH sql_objects AS (SELECT DISTINCT object_owner, object_name, object_typeFROM v$sql_plan WHERE sql_id = '&&sqlid' AND object_name IS NOT NULLAND object_owner IS NOT NULL
),
object_details AS (SELECT o.owner,o.object_name,o.object_type,o.status,s.bytes/1024/1024 as size_mb,s.blocks,CASE o.object_type WHEN 'TABLE' THEN (SELECT num_rows FROM dba_tables WHERE owner = o.owner AND table_name = o.object_name)WHEN 'INDEX' THEN (SELECT num_rows FROM dba_indexes WHERE owner = o.owner AND index_name = o.object_name)ELSE NULL END as num_rowsFROM sql_objects soJOIN dba_objects o ON so.object_owner = o.owner AND so.object_name = o.object_nameLEFT JOIN dba_segments s ON o.owner = s.owner AND o.object_name = s.segment_name
)
SELECT owner,object_name,object_type,status,size_mb,blocks,num_rows
FROM object_details
ORDER BY owner, object_type, object_name;PROMPT
PROMPT 6.1 Table Statistics:
PROMPT =====================WITH sql_tables AS (SELECT DISTINCT object_owner as owner, object_name as table_nameFROM v$sql_plan WHERE sql_id = '&&sqlid' AND object_type LIKE 'TABLE%'AND object_name IS NOT NULL
)
SELECT t.owner,t.table_name,t.num_rows,t.blocks,ROUND(t.blocks * ts.block_size/1024/1024, 2) as size_mb,t.last_analyzed,t.partitioned
FROM sql_tables st
JOIN dba_tables t ON st.owner = t.owner AND st.table_name = t.table_name
JOIN dba_tablespaces ts ON t.tablespace_name = ts.tablespace_name
ORDER BY t.owner, t.table_name;PROMPT
PROMPT 6.2 Index Statistics:
PROMPT =====================WITH sql_indexes AS (SELECT DISTINCT object_owner as owner, object_name as index_nameFROM v$sql_plan WHERE sql_id = '&&sqlid' AND object_type LIKE 'INDEX%'AND object_name IS NOT NULL
)
SELECT i.owner,i.index_name,i.table_name,i.uniqueness,i.blevel,i.leaf_blocks,i.distinct_keys,i.clustering_factor,i.status
FROM sql_indexes si
JOIN dba_indexes i ON si.owner = i.owner AND si.index_name = i.index_name
ORDER BY i.owner, i.table_name, i.index_name;PROMPT
PROMPT ****************************************************************************************
PROMPT 7. BIND VARIABLES INFORMATION
PROMPT ****************************************************************************************SELECT child_number,name,position,datatype_string,value_string,last_captured
FROM v$sql_bind_capture
WHERE sql_id = '&&sqlid'
ORDER BY child_number, position;PROMPT
PROMPT ****************************************************************************************
PROMPT 8. EXECUTION HISTORY FROM ASH
PROMPT ****************************************************************************************SELECT TO_CHAR(sample_time, 'YYYY-MM-DD HH24:MI') as sample_time,session_id,session_serial#,program,event,wait_time,time_waited
FROM v$active_session_history
WHERE sql_id = '&&sqlid'
AND sample_time > SYSDATE - 1/24  -- Last 1 hour
ORDER BY sample_time DESC
FETCH FIRST 20 ROWS ONLY;PROMPT
PROMPT ****************************************************************************************
PROMPT 9. MEMORY USAGE
PROMPT ****************************************************************************************SELECT child_number,sharable_mem,persistent_mem, runtime_mem,sorts,loaded_versions,open_versions,users_opening,users_executing
FROM v$sql
WHERE sql_id = '&&sqlid'
ORDER BY child_number;PROMPT
PROMPT ****************************************************************************************
PROMPT 10. SQL TEXT (Full)
PROMPT ****************************************************************************************SELECT sql_fulltext
FROM v$sqlarea
WHERE sql_id = '&&sqlid'
AND ROWNUM = 1;PROMPT
PROMPT ================================================================================
PROMPT End of SQL Optimizer Report
PROMPT ================================================================================SPOOL OFF-- 清理格式
CLEAR COLUMNS
CLEAR BREAKSPROMPT
PROMPT Report generated: &output_file
PROMPT

纯属个人意见,大家不喜勿喷!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页调试和jmeter调试天气预报

打开万维易源-天气预报-在线调试地区改成烟台打开Jmeter-新建线程组-HTTP请求建个结果树-保存+运行

2025 主流 BPM 厂商全解析:功能、优势与应用场景

在企业数字化转型日益深入的今天,业务流程管理(BPM)系统已成为企业实现运营敏捷性、提升效率与确保合规性的战略核心。特别是随着低代码、微服务架构和人工智能(AI)技术的深度融合,BPM市场正经历着一场深刻的变革…

.在线调试快递

1.打开在线调试 2.填入快递单号 3.填入快递公司4点击调用接口

软件未来预测的准确性与代码简洁之道

本文探讨了软件设计中未来预测的准确性如何随系统复杂度变化,通过Python版本变迁等实例说明保持代码简洁的重要性,以及为什么过度设计往往会导致不必要的复杂性。未来预测的准确性 关于软件设计,我们知道未来很重要…

2025年石英砂生产线厂家权威推荐榜单:硅砂生产线/光伏砂生产线/玻璃砂生产线源头厂家精选

在石英砂加工和矿山设备领域,高效、环保的生产线配置直接影响产品质量与企业效益。本文将基于企业规模、技术实力、市场覆盖及客户反馈等多维度数据,为您解析石英砂生产线行业权威厂家榜单。 一、石英砂生产线市场技…

详细介绍:【 苍穹外卖day6 | 微信小程序 】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年电线电缆厂权威推荐榜单:亚洲电缆/阻燃电缆/光伏电缆源头厂家精选

在新能源产业迅猛发展与建筑电气安全标准持续提升的背景下,电线电缆作为电力传输与信号传递的核心载体,其导电性能、阻燃等级与环境适应性直接关系到整个电力系统的安全与效率。行业数据显示,2025年我国家装电缆市场…

第八周第五天8.5

所用时间:180分钟 代码量(行):0 了解到的知识点: 1.flash动画设计 Flash 动画设计是基于 Adobe Flash(现多转向 Animate)的矢量动画创作形式,核心优势是文件小、交互性强,曾广泛用于网页动画、小游戏、广告等…

一次由 DNS 反解析引发的 SpringBoot 启动卡顿问题

TL;DR使用 114 DNS 时,反解析内网 IP 无响应,导致 SpringBoot 启动时 Liquibase 初始化阻塞约 30 秒 InetAddress.getLocalHost() 获取到的可能是127.0.0.1,而非实际的内网 IP(如 192.168.x.x)现象 SpringBoot启动…

2025年航空警示球厂家权威推荐榜单:有机复合材料手孔井/树脂穿线井/复合弱点手孔井源头厂家精选

在航空安全和工业管道运输领域,航空警示球作为关键的视觉警示设备,对保障低空飞行安全和架空管线标识起着至关重要的作用。本文将基于企业技术实力、产品质量、市场份额及客户反馈等多维度数据,为您解析航空警示球行…

平面最近对(p1429)

P1429 平面最近点对(加强版) 题目背景 P7883 平面最近点对(加强加强版) 题目描述 给定平面上 \(n\) 个点,找出其中的一对点的距离,使得在这 \(n\) 个点的所有点对中,该距离为所有点对中最小的。 输入格式 第一行…

用Jmeter向测试接口发送快递查询请求

用Jmeter向测试接口发送快递查询请求原理:向服务器发送数据包,以获取相应快递信息 准备工作: 1.在测试计划中添加线程组;在线程组中添加HTTP请求;在线程组中添加结果树。 2.在http请求中填写各项信息 如图即为所示…

查询天气预报

1 一在万维在线调试二 在jmeter

基于PCA白化和K均值聚类的轴承故障诊断系统

基于PCA白化和K均值聚类的轴承故障诊断系统。方法结合了降维、去相关和聚类分析,能够有效识别不同的故障模式。 1. 轴承故障数据生成与特征提取 classdef BearingFaultData% 轴承故障数据生成与特征提取propertiessam…

五城渠道招商会圆满收官,纷享销客全国生态布局再提速!

近日,纷享销客 2025 年渠道招商闭门会在东莞、武汉、郑州、长沙、重庆五城相继落下帷幕。活动以 “智享未来・领创 CRM 新纪元”为主题,吸引了各地伙伴深度参与,共探数字化浪潮下的业务突破新路径。作为智能型 CRM …

2025年11月空气能热泵厂家推荐:知名机构榜与口碑评价对比指南

一、引言 空气能热泵在“双碳”战略与北方清洁采暖政策叠加的2025年,已成为工商业与家庭热源升级的首选技术路线。中国节能协会热泵专业委员会发布的《2025中国热泵供暖行业白皮书》指出,行业年复合增长率保持在18.7…

2025年苏州吊车租赁公司权威推荐榜单:龙门吊租赁/升降机租赁/高空作业车租赁公司精选

在苏州及长三角地区的工业建设和项目施工中,吊车租赁服务的专业化与可靠性直接影响着工程效率与安全。本文将基于设备规模、服务案例、资质认证及客户口碑等多维度数据,为您呈现苏州地区吊车租赁行业的权威推荐榜单。…

查询快递

1.在万维易源的易源精选中,选择全球快递物流查询。 2.购买次数,在线调试,将已有信息删除,nu=JDAZ22019040560(要查询的快递单号),调用接口 3.在jmeter中新建一个线程组,http请求,填上信息4.保存,添加查看结果…

在JMeter中查询天气和快递

一.查询天气 1.打开JMeter,新建测试计划——新建添加——线程——线程组——添加取样器——http请求 2.服务名称或id:输入route.showapi.com,路径输入:/9-2 3.下方添加:appKey对应的填入2E910e4ced5B432dA675573e…

快递查询,-jmeter

1.添加 线程组 --->http请求---->查看树 2.添加信息:com:快递公司,不知填auto nu:快递单号