Oracle大师Roger Cornejo的推荐:使用ASH诊断Oracle解析故障

这篇文章被Oracle大师Roger Cornejo在X平台上推荐(见下图),英文原文在:

Diagnosing Parsing Issue with ASH

在这里插入图片描述

解析,尤其是硬解析,是非生产性操作,会消耗大量系统资源,导致库缓存争用。ASH(Active Session History)可以通过其采样机制来诊断和分析过度的解析。本文探讨了如何有效地使用ASH来识别解析问题。

模拟解析问题

首先,我们使用以下PL/SQL匿名块来模拟解析问题:

SQL> set timing on
SQL> create table yuan_obj as select * from dba_objects;Table created.Elapsed: 00:00:00.746
SQL>
SQL> declare2    i number;3    sql_text varchar2(256);4  begin5    for i in 1..100000 loop6       sql_text := 'select object_name from yuan_obj where object_id = '||i;7       execute immediate sql_text;8    end loop;9  end;10  /PL/SQL procedure successfully completed.Elapsed: 00:05:44.904

此场景是由于缺乏绑定变量而导致的低效SQL执行的经典示例。

检测解析问题

v$active_session_historyDBA_HIST_ACTIVE_SESS_HISTORY视图中的in_parsein_hard_parse列可用于检测解析问题:

  1. in_parse:此列指示会话当前是否正在执行解析操作。
  2. in_hard_parse:此列指示会话是否正在执行硬解析。

以下SQL查询在过去10分钟内分组并统计解析活动的发生次数:

col in_parse form a10
col in_hard_parse form a10
select in_parse,in_hard_parse,count(*) as cnt,100 * trunc(ratio_to_report(count(*)) over (), 4) as "PERCENT"from v$active_session_historywhere sample_time > current_timestamp - interval '10' minutegroup by in_parse, in_hard_parseorder by count(*) desc;

当运行低效的PL/SQL块时,我们得到如下输出:

IN_PARSE   IN_HARD_PARSE     CNT   PERCENT
Y          Y                 229     91.23
Y          N                  17      6.77
N          N                   5      1.99

此输出表明解析,尤其是硬解析,占据了大多数数据库活动,只有1.99%的数据库资源真正用于查询执行。

让我们通过分析数据库正在经历的等待事件来深入了解:

col event form a30
set linesize 200
SELECTNVL(event, 'ON CPU') AS event,COUNT(*) AS total_wait_time,TO_CHAR(100 * TRUNC(RATIO_TO_REPORT(COUNT(*)) OVER (), 6), 'FM990.9999') || '%' AS "%"
FROMv$active_session_history
WHEREsample_time > SYSDATE - 10 / 60 / 24
GROUP BYevent
ORDER BYtotal_wait_time DESC;

输出:

EVENT                          TOTAL_WAIT_TIME %
------------------------------ --------------- ----------
ON CPU                                     503 92.1245%
latch: shared pool                          38 6.9597%
library cache: mutex X                       4 0.7326%
latch: row cache objects                     1 0.1831%

此输出表明解析大量使用了CPU,并且溢出到相关的Oracle等待事件中。

识别有问题的SQL语句

要识别有问题的SQL语句,可以利用v$sqlstats中的force_matching_signature列。此列包含一个哈希值,用于标识在文本上相似但可能具有不同文字值的SQL语句。此哈希值用于基于相似但不完全相同的SQL语句进行光标共享。

以下查询将v$active_session_historyv$sqlstats连接,以检索与最频繁执行的SQL语句共享相同force_matching_signature的SQL语句。

SELECT a.sample_time,a.sql_id,NVL(a.event, 'CPU') AS event,a.in_parse,a.in_hard_parse,a.force_matching_signature,t.exact_matching_signature,t.sql_text
FROM v$active_session_history a
LEFT JOIN v$sqlstats t ON a.sql_id = t.sql_id
WHERE t.force_matching_signature = (SELECT force_matching_signatureFROM (SELECT s.force_matching_signature, COUNT(*) AS cntFROM v$sqlstats sGROUP BY s.force_matching_signatureORDER BY COUNT(*) DESC)WHERE ROWNUM = 1
);

另一种发现相似SQL语句的方法是比较编辑后的SQL文本:

SELECT a.sample_time,a.sql_id,NVL(a.event, 'CPU') AS event,a.in_parse,a.in_hard_parse,a.force_matching_signature,t.exact_matching_signature,t.sql_text
FROM v$active_session_history a
LEFT JOIN v$sqlstats t ON a.sql_id = t.sql_id
WHERE SUBSTR(t.sql_text, 1, 40)= (SELECT truncated_sql_textFROM (SELECT SUBSTR(s.sql_text, 1, 40) AS truncated_sql_text,  COUNT(*) AS cntFROM v$sqlstats sGROUP BY SUBSTR(s.sql_text, 1, 40)ORDER BY COUNT(*) DESC)WHERE ROWNUM = 1
);

虽然两个查询的目的是相同的,但使用force_matching_signature的查询通常更准确。在这种情况下,两个查询产生相同的输出,如下所示(为简洁起见进行了截断):
在这里插入图片描述
输出显示了文本上相似的SQL语句(具有相同的FORCE_MATCHING_SIGNATURE,即4786214959369239152)可以具有不同的字面值,从而具有不同的EXACT_MATCHING_SIGNATURE和不同的SQL_ID

解决方案建议

在识别出有问题的SQL语句后,我们应与应用程序供应商合作修改应用程序代码。目标是尽可能用绑定变量替换文字。这种修改允许Oracle重用执行计划,从而减少与解析相关的开销。

可以将之前低效的PL/SQL优化如下:

DECLAREi NUMBER;
BEGINFOR i IN 1..100000 LOOPEXECUTE IMMEDIATE 'select object_name from yuan_obj where object_id = :1' USING i;END LOOP;
END;
/
SQL> alter system flush shared_pool;System altered.SQL> set timing on
SQL> DECLARE2    i NUMBER;3  BEGIN4    FOR i IN 1..100000 LOOP5      EXECUTE IMMEDIATE 'select object_name from yuan_obj where object_id = :1' USING i;6    END LOOP;7  END;8  /PL/SQL procedure successfully completed.Elapsed: 00:00:03.298

优化后的块显著更快,将执行时间从近6分钟减少到仅3秒多。

待优化后的块运行结束后,从v$active_session_historyv$sqlstats视图中检索先前SQL执行的信息:

SELECT a.sample_time,a.sql_id,NVL(a.event, 'CPU') AS event,a.in_parse,a.in_hard_parse,a.force_matching_signature,t.exact_matching_signature,t.sql_text
FROM v$active_session_history a
LEFT JOIN v$sqlstats t ON a.sql_id = t.sql_id
WHERE SUBSTR(t.sql_text, 1, 40)= substr('select object_name from yuan_obj where object_id =',1,40);

在这里插入图片描述
输出只包含两条已执行SQL的条目。相同的SQL_ID、FORCE_MATCHING_SIGNATURE、EXACT_MATCHING_SIGNATURE和SQL_TEXT的值表明SQL只解析了一次,并且其执行计划被重用了,这大大减少了在Library Cache中的占用。

另一种缓解Library Cache争用的方法是增加Shared Pool的大小。此调整可以提高频繁执行的SQL语句及其执行计划保留在Library Cache中的可能性,从而减少重复解析的需求。

在某些情况下,将CURSOR_SHARING参数设置为FORCE可以通过强制Oracle内部用绑定变量替换文字来减少硬解析。然而,这应被视为会话级别的临时解决方案,而不是实例级别的永久解决方案。

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

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

相关文章

Meta 如何实现 99.99999999% 的缓存一致性

曾经的故事 Meta(Facebook) 曾经运行一个简单的技术栈——PHP 和 MySQL。 但随着更多用户的加入,他们面临着可扩展性问题。因此他们建立了一个分布式缓存。 虽然这暂时解决了可扩展性问题,但保持缓存数据的新鲜度变得困难。以下…

SpringBoot 整合 Redis 实现验证码登录功能

一、整合Redis 在pom.xml中添加Redis相关依赖&#xff1b; <!--Spring Data Redis依赖配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>…

阿里云账户注册与实名认证详细教程

在开始使用阿里云服务之前&#xff0c;您需要先有一个阿里云账号&#xff0c;拥有阿里云账号后&#xff0c;您可以选购和使用云产品和服务。如果您没有阿里云账号&#xff0c;需要先注册一个阿里云账号。 说明 一个手机号码下最多可以注册6个阿里云账号。如果您的手机号码已经…

一分钟了解VMware虚拟机三种网络模式区别

VMware虚拟机提供了三种主要的网络模式&#xff0c;分别是桥接模式&#xff08;Bridged Mode&#xff09;、网络地址转换模式&#xff08;NAT Mode&#xff09;和仅主机模式&#xff08;Host-Only Mode&#xff09;。这三种模式各有其特点和适用场景&#xff0c;以下是对它们之…

Perfectly Clear WorkBench中文绿色版,让每一张照片都完美无瑕

软件简介 你是否曾经为了一张不完美的照片而感到遗憾&#xff1f;是否曾经因为照片中的小瑕疵而不得不花费大量时间进行后期处理&#xff1f;现在&#xff0c;有了Perfectly Clear WorkBench&#xff0c;这些问题都将迎刃而解。作为全球领先的智能图像校正技术商推出的图像清晰…

jvm实战

一、查看JVM内存使用状况 jps 查看本地正在运行的java进程和进程ID(pid) win10报jps不是内部或外部命令,也不是可运行的程序或批处理文件解决?将用户变量和系统变量的Path都追加2个bin。 jinfo jinfo pid 查看指定pid的所有JVM信息jinfo -flags pid 查询虚拟机运行参数…

低代码开发平台:加速企业数字化转型的利器

前言 在软件开发领域&#xff0c;传统的编码方式往往复杂且耗时&#xff0c;对技术团队的技能要求高。随着企业数字化转型的加速&#xff0c;低代码开发平台作为一种新兴的解决方案&#xff0c;逐渐成为许多组织提升开发效率、降低技术门槛的利器。本文将深入探讨低代码开发的…

【Drools】(三)基于业务数据动态调用 DRL 规则文件:详细实现与测试指南

基于业务数据动态调用 DRL 规则文件&#xff1a;详解与实战 在业务规则管理中&#xff0c;DRL 文件&#xff08;Drools Rule Language 文件&#xff09;用于定义和执行业务规则。通过动态调用 DRL 文件&#xff0c;我们可以根据不同的业务场景灵活配置和执行定制化的规则&…

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.3工程体系架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题&#xff1a; 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用&#xff1a; 1.社交场景&#xff0c;比如朋友圈&#xff0c;附近的人的地点的存储 2.…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…

【Docker】Namespace 空间隔离实战

一、实战目的 了解隔离能力并不是 Docker 提供的&#xff0c;而是操作系统内核提供基本能力。 二、基础知识 1、dd 命令详解 Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、…

Vue3----扩展 element Plug card

扩展 element Plug card 增加全屏&#xff0c;折叠操作项 核心代码 <template><div class"cc-card-component"><el-card v-if"state.isShow" :class"state.class" :bodyStyle"bodyStyle" :shadow"props.shadow…

Vmwar保姆级安装与配置

文章目录 一、官方下载1.访问VMware官方网站&#xff1a;2.选择产品&#xff1a;3.下载安装包&#xff1a; 二、VMware的安装1.运行安装程序2.选择安装位置3.选择安装选项4.完成安装 三、启动VMware Workstation Pro并配置虚拟机1.创建新的虚拟机&#xff1a;2.配置虚拟机硬件 …

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

【云原生】Kubernetes----k8s免密使用harbor私有仓库

目录 引言 一、搭建Harbor仓库 &#xff08;一&#xff09;关闭防护 &#xff08;二&#xff09;安装docker &#xff08;三&#xff09;安装docker-compose &#xff08;四&#xff09;安装harbor-offline 1.获取安装包 2.修改配置文件 3.启动服务 4.登录仓库验证 二…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…

聚观早报 | OPPO Find X8系列电池曝光;小米15 Pro更多影像细节

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月30日消息 OPPO Find X8系列电池曝光 小米15 Pro更多影像细节 KeeTa平台已开放便利店入驻 比亚迪方程豹将扩大…

大模型面试之LoRA

LoRA的解释&#xff1a;一种高效微调预训练神经网络的方法 LoRA 解决的问题&#xff1a; &#x1f538; 2021年初&#xff0c;微软与OpenAI合作探索GPT-3的商业可行性。 &#x1f538; 发现仅仅通过提示&#xff08;prompting&#xff09;不足以完成生产任务&#xff0c;例如…