oracle direct path read处理过程

news2024/10/3 0:28:24

文章目录

  • 缘起
  • 处理过程
    • 1.AWR Report 分析
    • 2.调查direct path read发生的table
    • 3.获取sql text
    • 4.解释sql并输出执行计划:
  • 结论:
  • 补充direct path read等待事件说明

缘起

记录direct path read处理过程

处理过程

1.AWR Report 分析

问题发生时间段awr如下:
Load profile显示有大的read IO(MB):
在这里插入图片描述
Top 10等待事件by wait time
在这里插入图片描述
Top 等待时间by wait times
在这里插入图片描述

Top reads
显示top 1 sql_id是g2t273f41924k
在这里插入图片描述

2.调查direct path read发生的table

select e.* from dba_extents e,
(select event_id,p1,p2 from dba_hist_active_sess_history where 
to_char(sample_time,'YYYY-MM-DD hh24') between '2024-09-24 06:00:00'
and '2024-09-24 08:00:00' 
and event like '%direct path read%' and sql_id='g2t273f41924k') ev
where e.file_id=ev.p1 and ev.p2 between e.block_id and (e.block_id+blocks)
OWNER                          SEGMENT_NAME                                                                      SEGMENT_TYPE
------------------------------ --------------------------------------------------------------------------------- ------------------
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE
MES5040                        MES_CFM_CARTON_IN                                                                 TABLE

3.获取sql text

select sql_text from v$sqlarea where sql_id='g2t273f41924k'

输出:

SELECT ODR.ODR_NO, ODR.FIN_CUST_PO, ODR.CUST_ODR, ODR.ARTIC_NO, ODR.ETD_DATE, ODR.CUST_DATE, DECODE(ODR.REQ_DATE3,'00000000',(DECODE(ODR.REQ_DATE2,'00000000',ODR.RTD,ODR.REQ_DATE2)),ODR.REQ_DATE3) AS REQ_DATE2,
ODR.TOTAL_QTY,(SELECT COUNT(DISTINCT CARTON_NO) FROM MES5040.MES_PRO_CXBARCODE WHERE FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO AND SCAN_MK = 'Y') AS SCAN_CTN_QTY,
(SELECT SUM(YSCAN_QTY) FROM MES5040.MES_PRO_CXBARCODE WHERE FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO AND SCAN_MK = 'Y') AS SUM_QTY,
(SELECT NVL(MIN(DATUM),' ') FROM MES5040.MES_CFM_CARTON_IN WHERE WERKS = ODR.FACT_NO AND VBELN = ODR.ODR_NO AND MOVE_TYPE = '1') AS FRIST_SCAN_DATE,
(SELECT WM_CONCAT(DISTINCT SEC_NO) FROM MES5040.MES_PROD_PRODUCTION AA , MES5040.YY_FPODRM BB WHERE AA.ODR_NO = BB.FPODR_NO AND AA.PROD_TYPE = '005' AND BB.ODR_NO = ODR.ODR_NO) AS SEC_NM,
(SELECT WM_CONCAT(DISTINCT STORAGE_NO) FROM MES5040.MES_PROD_STORAGEPLANS WHERE FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS STORAGE_NO, (SELECT MAX(CHECK_MK_YJ) 
FROM MES5040.MES_QA_CHECK WHERE PROD_TYPE = '007' 
AND FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS CHECK_MK_YJ,
(SELECT MAX(CHECK_MK_SJ) FROM MES5040.MES_QA_CHECK WHERE PROD_TYPE = '007' AND FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS CHECK_MK_SJ,
(SELECT MAX(CHECK_MK) FROM MES5040.MES_QA_CHECK WHERE PROD_TYPE = '007' AND FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS CHECK_MK,
(SELECT MES_ODR_NO FROM MES5040.MES_TRANS_SAP_ODR WHERE FACT_NO = ODR.FACT_NO AND SAP_ODR_NO = ODR.ODR_NO) AS MES_ODR_NO
FROM MES5040.YY_ODRM ODR, (SELECT DISTINCT FACT_NO, ODR_NO FROM MES5040.MES_PRO_CXBARCODE WHERE SCAN_MK = 'Y' AND OUT_MK = 'N') MCCI
WHERE MCCI.FACT_NO = ODR.FACT_NO
AND MCCI.ODR_NO = ODR.ODR_NO
AND ODR.FACT_NO = :as_fact_no
AND ODR.BRAND_NO = :as_brand_no
AND ODR.YYMM BETWEEN :as_yymm_s AND :as_yymm_e

4.解释sql并输出执行计划:

explain plan for
SELECT ODR.ODR_NO, ODR.FIN_CUST_PO, ODR.CUST_ODR, ODR.ARTIC_NO, ODR.ETD_DATE, ODR.CUST_DATE, DECODE(ODR.REQ_DATE3,'00000000',(DECODE(ODR.REQ_DATE2,'00000000',ODR.RTD,ODR.REQ_DATE2)),ODR.REQ_DATE3) AS REQ_DATE2,
ODR.TOTAL_QTY,(SELECT COUNT(DISTINCT CARTON_NO) FROM MES5040.MES_PRO_CXBARCODE WHERE FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO AND SCAN_MK = 'Y') AS SCAN_CTN_QTY,
(SELECT SUM(YSCAN_QTY) FROM MES5040.MES_PRO_CXBARCODE WHERE FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO AND SCAN_MK = 'Y') AS SUM_QTY,
(SELECT NVL(MIN(DATUM),' ') FROM MES5040.MES_CFM_CARTON_IN WHERE WERKS = ODR.FACT_NO AND VBELN = ODR.ODR_NO AND MOVE_TYPE = '1') AS FRIST_SCAN_DATE,
(SELECT WM_CONCAT(DISTINCT SEC_NO) FROM MES5040.MES_PROD_PRODUCTION AA , MES5040.YY_FPODRM BB WHERE AA.ODR_NO = BB.FPODR_NO AND AA.PROD_TYPE = '005' AND BB.ODR_NO = ODR.ODR_NO) AS SEC_NM,
(SELECT WM_CONCAT(DISTINCT STORAGE_NO) FROM MES5040.MES_PROD_STORAGEPLANS WHERE FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS STORAGE_NO, (SELECT MAX(CHECK_MK_YJ) 
FROM MES5040.MES_QA_CHECK WHERE PROD_TYPE = '007' 
AND FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS CHECK_MK_YJ,
(SELECT MAX(CHECK_MK_SJ) FROM MES5040.MES_QA_CHECK WHERE PROD_TYPE = '007' AND FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS CHECK_MK_SJ,
(SELECT MAX(CHECK_MK) FROM MES5040.MES_QA_CHECK WHERE PROD_TYPE = '007' AND FACT_NO = ODR.FACT_NO AND ODR_NO = ODR.ODR_NO) AS CHECK_MK,
(SELECT MES_ODR_NO FROM MES5040.MES_TRANS_SAP_ODR WHERE FACT_NO = ODR.FACT_NO AND SAP_ODR_NO = ODR.ODR_NO) AS MES_ODR_NO
FROM MES5040.YY_ODRM ODR, (SELECT DISTINCT FACT_NO, ODR_NO FROM MES5040.MES_PRO_CXBARCODE WHERE SCAN_MK = 'Y' AND OUT_MK = 'N') MCCI
WHERE MCCI.FACT_NO = ODR.FACT_NO
AND MCCI.ODR_NO = ODR.ODR_NO
AND ODR.FACT_NO = :as_fact_no
AND ODR.BRAND_NO = :as_brand_no
AND ODR.YYMM BETWEEN :as_yymm_s AND :as_yymm_e

执行计划输出如下图:

select * from table(dbms_xplan.display())

在这里插入图片描述
谓词部分的输出:
在这里插入图片描述

结论:

很明显,没有合适的索引,造成优化器选择的full table scan
后续处理报给开发人员创建合适的索引后,问题得到解决

补充direct path read等待事件说明

这篇博客已经做出很好的解释了,引用如下:

Oracle 的11g版本正式发布到今天已经10年有余,最新版本也已经到了20c,但是Direct Path Read(直接路径读)导致性能问题的案例仍时有发生,很多12c的用户还是经常遇到这个问题,所以有必要把这个事情再跟大家讲一遍,通过2个典型案例加深理解。
早在2012年,盖国强大师就撰写文章,介绍了direct path read这个11g版本推出的新特性:
https://www.eygle.com/archives/2012/05/oracle_11g_direct_path_read.html ;也有人把关闭这个功能作为“最佳实践”,我建议先多了解一些具体情况再决定。
Direct path read的目的是让一些不常使用的大表数据(冷数据),在全表扫描时,每次都从磁盘读到用户的私有内存(PGA),而不要去挤占有限的、宝贵的、频繁使用的数据(热数据)所在的共享内存(SGA-bufer cache)。
热数据只在第一次访问时从磁盘读,读到SGA的buffer cache后,再次访问会直接从内存读,效率高、对存储压力小。
试想一个表被频繁全表扫描访问(缺少索引或业务设计不合理),一开始表还不算太大,会放到共享内存,只需要少量的磁盘读,这时对存储压力不大;随着记录数的不断增加,达到了一个参数设置的阀值和条件后,就会使用direct path read,频繁的磁盘读就会造成存储的巨大压力,出现严重的性能问题。
从共享内存读到直接路径读,这个变化在不频繁的全表扫描时是起到积极作用的;如果业务不合理(一个大表正常情况不会有频繁的全表扫描)、或者缺少索引(这个是比较多的情况),频繁的大表全表扫描就会在某个触发点上对数据库性能做出致命一击,导致业务瘫痪。

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

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

相关文章

FortiGate OSPF动态路由协议配置

1.目的 本文档针对 FortiGate 的 OSPF 动态路由协议说明。OSPF 路由协议是一种 典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由 域是指一个自治系统,即 AS,它是指一组通过统一的路由政策或路由协议互相交 换路由信息的网络。在这个 AS 中,所有的 …

基于JSP+Servlet+Layui实现的博客系统

> 这是一个使用 Java 和 JSP 开发的博客系统,并使用 Layui 作为前端框架。 > 它包含多种功能,比如文章发布、评论管理、用户管理等。 > 它非常适合作为 Java 初学者的练习项目。 一、项目演示 - 博客首页 - 加载动画 - 右侧搜索框可以输入…

开源服务器管理软件Nexterm

什么是 Nexterm ? Nexterm 是一款用于 SSH、VNC 和 RDP 的开源服务器管理软件。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 nexterm ,选择第一个 germannewsmaker/nexterm,版本选择 latest。 本文写作时, latest 版本对…

【STM32】RTT-Studio中HAL库开发教程七:IIC通信--EEPROM存储器FM24C04

文章目录 一、简介二、模拟IIC时序三、读写流程四、完整代码五、测试验证 一、简介 FM24C04D,4K串行EEPROM:内部32页,每个16字节,4K需要一个11位的数据字地址进行随机字寻址。FM24C04D提供4096位串行电可擦除和可编程只读存储器&a…

Excel 设置自动换行

背景 版本:office 专业版 11.0 表格内输入长信息,发现默认状态时未自动换行的,找了很久设置按钮,遂总结成经验帖。 操作 1)选中需设置的单元格/区域/行/列。 2)点击【开始】下【对齐方式】中的【自动换…

HAproxy,nginx实现七层负载均衡

环境准备: 192.168.88.25 (client) 192.168.88.26 (HAproxy) 192.168.88.27 (web1) 192.168.88.28 (web2) 192.168.88.29 (php1) 192.168.88.30…

基于微信小程序的教学质量评价系统ssm(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的教学质量评价系统的开发全过程。通过分析基于微信小程序的教学质量评价系统管理的不足,创建了一个计算机管理基于微信小程序的教学…

【Anti-UAV410】论文阅读

摘要 无人机在红外视频中的感知,对于有效反无人机是很重要的。现有的跟踪数据集存在目标大小和环境问题,不能完全表示复杂的逼真场景。因此作者就提出了Anti-UAV410数据集,该数据集总共410个视频和超过438K个标注框。为了应对复杂环境无人机跟…

丹摩智算(damodel)部署stable diffusion实验

名词解释: 丹摩智算(damodel):是一款带有RTX4090,Tesla-P40等显卡的公有云服务器。 stable diffusion:是一个大模型,可支持文生图,图生图,文生视频等功能 一.实验目标 …

Linux-TCP重传

问题描述: 应用系统进行切换,包含业务流量切换(即TongWeb主备切换)和MYSQL数据库主备切换。首先进行流量切换,然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求,第一批慢请求响应时间在133…

【HarmonyOS】应用引用media中的字符串资源如何拼接字符串

【HarmonyOS】应用引用media中的字符串资源如何拼接字符串 一、问题背景: 鸿蒙应用中使用字符串资源加载,一般文本放置在resoutces-base-element-string.json字符串配置文件中。便于国际化的处理。当然小项目一般直接引用字符串,不需要加载s…

计算机毕业设计 基于Python国潮男装微博评论数据分析系统的设计与实现 Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

LeetCode 149. 直线上最多的点数

LeetCode 149. 直线上最多的点数 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1: 输入:points [[1,1],[2,2],[3,3]] 输出:3 示例 2: 输入&…

【数据结构之线性表】有序表的合并(链表篇)

链表有序表的合并 思路图 将链表L1和L2按照顺序合并到L3中(注:三个链表都是带头结点的) A、要实现有序合并,必须先比较L1,L2两表中结点的大小,这里我们暂时先不讨论,直接根据图中来进行思路整理&#xff…

pve主要架构和重要服务介绍

Proxmox VE (PVE) 是一款开源的虚拟化平台,它基于 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 技术,支持虚拟机和容器的运行。PVE 还提供高可用集群管理、软件定义存储、备份和恢复以及网络管理等企业级功能。下面介绍 PVE 的主要架…

jenkins中多个vue项目共用一个node_modules减少服务器内存的占用,对空间造成资源浪费

多个vue项目使用的node_modules一致,每个项目都安装一遍依赖,对空间造成资源浪费。 通过服务器上的软连接mklink(windows服务器,如果是linux服务器用ln)来共用一套node_modules windows mklink /d [链接文件或目录] [原始文件或目录] 进入…

二叉树的基本概念(下)

文章目录 🍊自我介绍🍊二叉树的分类满二叉树完全二叉树 🍊二叉树的存储顺序存储[完全二叉树]链式存储 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ &#x1f34…

无人机避障——4D 毫米波雷达 SLAM篇(一)

做无人机避障相关工作,3D毫米波避障测试顺利后,开始做4D毫米波雷达无人机避障遇到4D雷达点云需要进行处理的问题,查阅文献,发现以下这篇文章中的建图方法应该为后续思考的方向,特此将这个开源项目进行复现和学习&#…

react crash course 2024(2) 创建项目及vscode插件

使用vite创建react项目 npm create vitelatest react-crash-2024 跳到那个项目 cd .\react-crash-2024 打开那个项目 code . 在vite.config.js中设置端口 安装依赖 npm i 运行 npm run dev vs code插件 rafce //在底部导出的react箭头函数组件

计算机毕业设计 基于Python医院预约挂号系统 Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…