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 查询虚拟机运行参数…

【Go - mongodb - bson / schema】

Bson是什么 bson 是 MongoDB 使用的一种二进制编码格式&#xff0c;全称为 Binary JSON。它用于存储和传输 JSON 风格的文档数据。bson 提供了一种高效的方式来表示 JSON 数据&#xff0c;同时支持更多的数据类型&#xff0c;例如日期和二进制数据。 在 Go 语言中&#xff0c…

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

前言 在软件开发领域&#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…

wc -l 统计文件中的行数

wc -l 是一个常用的命令行工具&#xff0c;用于统计文件中的行数。它的使用格式是&#xff1a; wc -l [文件名] 主要用途是计算指定文件中的行数。例如&#xff0c;如果有一个名为 example.txt 的文件&#xff0c;要查看它有多少行&#xff0c;可以运行&#xff1a; wc -l exam…

16 html网页服务和nginx服务

第十六次7.29 1.静态页面 1安装httpd [rootweb ~]# yum -y install httpd 2.真机访问页面 [rootweb html]# echo "静态html文件" > index.html 传入照片再次访问 静态资源&#xff0c;根据开发着保存在项目资源目录中的路径访问静态页面的资源 2.Apache 1.安…

【Docker】Namespace 空间隔离实战

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

淘宝商家电话采集 淘宝店铺爬虫软件使用教程

淘宝商家电话采集&#xff1a;淘宝店铺爬虫软件使用教程 淘宝作为中国最大的电子商务平台之一&#xff0c;拥有众多的商家和店铺。有时候我们需要获取特定店铺的联系电话&#xff0c;以便进行合作洽谈或者其他目的。本文将介绍如何使用Python编写一个淘宝店铺爬虫软件来采集商…

有效组织离散变量:指针数组在C语言中的应用

把离散变量组织起来&#xff0c;访问起来更加方便&#xff0c;无需一个个变量单独赋值。 如modbus读写reg&#xff0c; 把a\b\c\d实时变化分散的变量组织成一个数组reg&#xff0c;方便获取 相当于变量的内存地址池 int main() {int a 10, b 20, c 30, d 40;int i;int *re…

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…

英语:四、冠词

1、冠词的概述 &#xff08;1&#xff09;冠词的分类 根据冠词的用法&#xff0c;它可以分为定冠词、不定冠词和零冠词。 定冠词 the 不定冠词 a an 零冠词 名词前面没有冠词 &#xff08;2&#xff09;冠词的位置 a、放在名词之前 一般情况下&#xff0c;冠词置于…

Vmwar保姆级安装与配置

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