当前位置: 首页 > news >正文

oracle direct path read处理过程

文章目录

  • 缘起
  • 处理过程
    • 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,频繁的磁盘读就会造成存储的巨大压力,出现严重的性能问题。
从共享内存读到直接路径读,这个变化在不频繁的全表扫描时是起到积极作用的;如果业务不合理(一个大表正常情况不会有频繁的全表扫描)、或者缺少索引(这个是比较多的情况),频繁的大表全表扫描就会在某个触发点上对数据库性能做出致命一击,导致业务瘫痪。

相关文章:

  • uniapp js怎么根据map需要显示的点位,计算自适应的缩放scale
  • 【Unity踩坑】Textmesh Pro是否需要加入Version Control?
  • 经典sql题(十四)炸裂函数的恢复
  • 资金晋阶司库|基于数字化标准建立的操作类应用
  • 生物医学光学第三章作业:归纳和总结生物发光的主要类型和特点
  • Linux 网络配置 (深入理解)
  • 网站建设公司如何选?2024专业网站建设公司哪家好TOP3
  • 解决json格式转换被特殊字符截断问题
  • EEPROM手册笔记
  • uniapp js向json中增加另一个json的全部数据,并获取json长度
  • 低空经济时代:无人机飞行安全要点详解
  • 探索自闭症表现研究报告:了解最新科研成果
  • 胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑
  • 【有啥问啥】大型语言模型的涌现能力(Emergent Abilities):新一代AI的曙光
  • 企业微信:客户联系自带群发工具和聊天工具
  • Consul Config 使用Git做版本控制的实现
  • Java 内存分配及垃圾回收机制初探
  • jQuery(一)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Otto开发初探——微服务依赖管理新利器
  • PAT A1050
  • PHP变量
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spark RDD学习: aggregate函数
  • sublime配置文件
  • Vue2.x学习三:事件处理生命周期钩子
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 让你的分享飞起来——极光推出社会化分享组件
  • 删除表内多余的重复数据
  • 深度学习中的信息论知识详解
  • 携程小程序初体验
  • 鱼骨图 - 如何绘制?
  • k8s使用glusterfs实现动态持久化存储
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​linux启动进程的方式
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #pragma预处理命令
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #大学#套接字
  • $.ajax,axios,fetch三种ajax请求的区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (160)时序收敛--->(10)时序收敛十
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Oracle)SQL优化技巧(一):分页查询
  • (SpringBoot)第二章:Spring创建和使用
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (一)SpringBoot3---尚硅谷总结
  • (转)Windows2003安全设置/维护
  • (转载)hibernate缓存
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *上位机的定义
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】