使用ASH诊断Oracle解析故障

news2024/9/21 22:31:09

英文原文在: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> declare
  2    i number;
  3    sql_text varchar2(256);
  4  begin
  5    for i in 1..100000 loop
  6       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_history
 where sample_time > current_timestamp - interval '10' minute
 group by in_parse, in_hard_parse
 order 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
SELECT
    NVL(event, 'ON CPU') AS event,
    COUNT(*) AS total_wait_time,
    TO_CHAR(100 * TRUNC(RATIO_TO_REPORT(COUNT(*)) OVER (), 6), 'FM990.9999') || '%' AS "%"
FROM
    v$active_session_history
WHERE
    sample_time > SYSDATE - 10 / 60 / 24
GROUP BY
    event
ORDER BY
    total_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_signature
    FROM (
        SELECT s.force_matching_signature, COUNT(*) AS cnt
        FROM v$sqlstats s
        GROUP BY s.force_matching_signature
        ORDER 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_text
    FROM (
        SELECT SUBSTR(s.sql_text, 1, 40) AS truncated_sql_text,  COUNT(*) AS cnt
        FROM v$sqlstats s
        GROUP 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优化如下:

DECLARE
  i NUMBER;
BEGIN
  FOR i IN 1..100000 LOOP
    EXECUTE 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> DECLARE
  2    i NUMBER;
  3  BEGIN
  4    FOR i IN 1..100000 LOOP
  5      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.coloradmin.cn/o/1972548.html

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

相关文章

MySQL--插入、更新与删除数据

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、插入数据 1、为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值,其语法: inser…

Gradle 统一管理依赖

BOM 介绍 BOM 是 Bill of Material 的简写,表示物料清单。BOM 使我们在使用 Maven 或 Gradle 构建项目时对于依赖版本的统一变得更加规范,升级依赖版本更容易。 比如我们使用 SpringBoot 和 SpringCloud 做项目时,可以使用他们发布的 BOM …

CIFAR-10 数据集图像分类与可视化

数据准备 CIFAR-10 and CIFAR-100 datasets (toronto.edu)在上述网站中下载Python版本的CIFAR-10数据集。 下载后的压缩包解压后会得到几个文件如下: 对应的data_batch_1 ~ data_batch_5 是划分好的训练数据,每个文件里包含10000张图片,test…

基于SpringBoot + Vue的前后端分离项目-外包平台

项目名称:外包平台 作者的B站地址:程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址:程序员云翼-CSDN博客 1.项目技术栈: 前后端分离的项目 后端:Springboot MybatisPlus 前端:Vue …

达梦数据库安装(DM8)新版 windows11下安装及超详细使用教程

windows11下达梦数据库安装 1、安装参考链接2、存在问题2.1新建表空间失败,详情错误号: -70142.2创建表、视图等 1、安装参考链接 https://blog.csdn.net/u014096024/article/details/134722013 2、存在问题 2.1新建表空间失败,详情错误号: -7014 解决…

掌握 LINQ:通过示例解释 C# 中强大的 LINQ的集运算

文章目录 集运算符原理实战示例1. Union2. Intersect3. Except4. ExceptWith5. Concat6. Distinct 注意事项总结 在C#中,LINQ(Language Integrated Query)提供了丰富的集合操作功能,使得对集合数据进行查询、过滤、排序等操作变得…

从程序员视角浅入浅出了解计算机硬件——内存

前言 内存(Memory)是计算机的重要部件,用于存储数据和指令的重要组件,是冯诺依曼计算机中是的存储器部分。作为与CPU进行沟通的桥梁,内存用于临时存储计CPU中的运算数据,以及与硬盘、网卡等外部组件数据,以便CPU能够快…

STM32卡死、跑飞如何调试确定问题

目录 前言 一、程序跑飞原因 二、调试工具 2.1Registers工具 2.2 Memory工具 2.3 Disassembly工具 2.4 Call Stack工具 三、找到程序跑飞位置 方式一、 方式二、 前言 我们初学STM32的时候代码难免会出现疏忽,导致程序跑飞,不再正常运行&#…

电脑桌面便签软件哪个好,桌面便签如何显示在桌面?

在繁忙的工作日里,一款优秀的电脑桌面便签软件就像是一位贴心的小秘书,帮助你记录重要事项,提醒你不要错过任何细节。那么,哪个电脑桌面便签软件可以帮助我们更好地记录和管理日常工作和学习中的事项呢?又如何将桌面便…

16.搜索框滑块和简单验证

一、一些简单的验证 邮箱验证 <!-- 邮件验证 --><p>邮箱&#xff1a;<input type"email" name"email"></p>邮箱验证框的type是email&#xff0c;在框内&#xff0c;它会自动检测输入内容的格式 &#xff0c;若格式非邮箱格式&…

从分散到整合,细说比特币发展史

原文标题&#xff1a;《Layered Bitcoin》 撰文&#xff1a;Saurabh Deshpande 编译&#xff1a;Chris&#xff0c;Techub News 古往今来&#xff0c;货币在社会中都具有三个关键的功能&#xff1a;财富的储存手段、交换媒介和计量单位。虽然货币的形式在不断变化&#xff0c…

一文了解一下 MindSpeed,MindSpeed 是专为华为昇腾设备设计的大模型分布式加速套件。

https://gitee.com/ascend/MindSpeed Gitee Ascend/MindSpeed 项目&#xff0c;MindSpeed 是针对华为昇腾设备的大模型加速库。 MindSpeed 是专为华为昇腾设备设计的大模型加速库&#xff0c;旨在解决用户在大模型训练过程中遇到的显存资源不足等挑战。该库借鉴了 Megatron、D…

如何理解分布式光纤测温DTS的“实时在线监测”的概念?

实时在线监测是相对于非实时在线监测而言的一种高要求的监测方式。在非实时监测中&#xff0c;我们可以使用手持红外测温仪等设备&#xff0c;在需要时进行开机测量&#xff0c;而在不需要时则可以关机。然而&#xff0c;实时在线监测的目标是要求连续、全天候、每秒都不间断地…

检索增强生成RAG系列10--RAG的实际案例

讲了很多理论&#xff0c;最后来一篇实践作为结尾。本次案例根据阿里云的博金大模型挑战赛的题目以及数据集做一次实践。 完整代码地址&#xff1a;https://github.com/forever1986/finrag.git 本次实践代码有参考&#xff1a;https://github.com/Tongyi-EconML/FinQwen/ 目录 …

我的cesium for UE 踩坑之旅(一)

我的小小历程 创建过程场景搭建引入cesium for UE插件创建空白关卡并添加SunSky照明和FloatingPawn进行场景设置设置cesium token重设场景初始点位置顶层菜单窗口 —>打开cesium ion Assets &#xff0c;从而加入自己的资产 UI制作前端UI页面制作顶部菜单打开内容浏览器窗口…

第100+19步 ChatGPT学习:R实现朴素贝叶斯分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现朴素贝叶斯分类 &#xf…

人工智能ai聊天都有哪些?分享4款智能软件!

在这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经悄然渗透到我们生活的方方面面&#xff0c;其中最令人兴奋的莫过于那些能够与人类进行流畅对话的AI聊天软件。它们不仅让交流跨越了物种的界限&#xff0c;更在娱乐、教育、客服等多个领域展现出无…

苹果电脑可以玩什么小游戏 适合Mac电脑玩的休闲游戏推荐

对于游戏爱好者而言&#xff0c;Mac似乎并不是游戏体验的首选平台。这主要是因为相较于Windows系统&#xff0c;Mac上的游戏资源显得相对有限。不过&#xff0c;这并不意味着Mac用户就与游戏世界绝缘。实际上&#xff0c;Mac平台上有着一系列小巧精致且趣味横生的小游戏&#x…

苍穹外卖项目day12(day09)---- 查询历史订单、查询订单详情、取消订单、再来一单(用户端)

目录 用户端历史订单模块&#xff1a; - 查询历史订单 产品原型 业务规则 接口设计 user/OrderController OrderService OrderServiceImpl OrderMapper OrderMapper.xml OrderDetailMapper 功能测试&#xff1a; - 查询订单详情 产品原型 接口设计 OrderControll…

安卓常用控件(下)

ImageView ImageView是用于在界面上展示图片的一个控件&#xff0c;它可以让我们的程序界面变得更加丰富多彩。 属性名描述id给当前控件定义一个唯一的标识符。layout_width给控件指定一个宽度。match_parent&#xff1a;控件大小与父布局一样&#xff1b;wrap_content&#x…