一、 简介

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-buffer cache)。

热数据只在第一次访问时从磁盘读,读到SGA的buffer cache后,再次访问会直接从内存读,效率高、对存储压力小。

试想一个表被频繁全表扫描访问(缺少索引或业务设计不合理),一开始表还不算太大,会放到共享内存,只需要少量的磁盘读,这时对存储压力不大;随着记录数的不断增加,达到了某些条件后(下文会提到),就会使用direct path read,频繁的磁盘读就会造成存储的巨大压力,出现严重的性能问题。

从共享内存读到直接路径读,这个变化在不频繁的全表扫描时是起到积极作用的;如果业务不合理(一个大表正常情况不会有频繁的全表扫描)、或者缺少索引(这个是比较多的情况),频繁的大表全表扫描就会在某个触发点上对数据库性能做出致命一击,导致业务瘫痪。

二、 两个典型案例

1. 案例1

某银行业务数据库A夜间跑批业务突然变慢,查了很长时间,对top sql也做了“优化”(清除历史数据,虽然是比较初级优化手段,但是也最有效,如果数据需要保留就不行),仍未解决。因为是5~6套数据库共享一套存储,而且表现在存储响应时间慢,开始对其他几套库进行排查,发现其中一套数据库B在这段时间内IO消耗突增。

故障时段AWR报告显示如下:

数据库B之前正常时段AWR 情况:

awr对比是分析系统性能问题的一个重要手段,建议定期保存awr基线

Load Profile(Read IO相差1000多倍 1057.6M vs 0.7M):

Top events:direct path read只占 DB time 的0.1% (故障时段63.1%):

Top Read SQL:消耗较少物理读

通过对比发现是一个SQL的物理读突增导致存储整体下降,影响到存储上的其他数据库。

对该TOP SQL分析发现,sql执行频繁,执行计划没有改变(下图红框内第一列,一直是全表扫描),但是某天夜间突然Disk Reads次数(下图中间部分)暴增,这个时间正是数据库A跑批业务出问题的时间段,下面是sqlhc收集到的sql执行历史信息:

该SQL逻辑比较简单,2个谓词条件的单表查询,只需要创建一个简单索引,即可避免全表扫描。创建索引后,一切恢复正常。

根因分析:  

如果不把导致问题的根本原因找到,那么很有可能下次还会再发生。根因分析需要有一定深度的技术水平才能做到,很多时候故障只是临时解决,根因未找到前还会不断发生。

有个隐含参数_serial_direct_read,决定dirrect path read的使用方式,默认是auto(共有false, true, never, auto, always几个选项),auto方式下有下面几个已知触发条件:

  • 表大小超过 _small_table_threshold 隐含参数设置的阀值

  • 表在buffer cache块数低于50%

  • 表脏块数低于的25%

上面几个条件,只要有一个不满足,都不会使用Direct path read。频繁使用的大表,达到_small_table_threshold 阀值后,因为仍有大量数据在buffer cache,不会立即触发Direct path read,但是如果遇到其他大表挤占了buffer cache,buffer cache块数低于50%,就满足了触发条件。

另外还有一个参数_very_large_object_threshold,默认值500,即表大小超过5倍_db_block_buffers时,也会选择direct path read,这里不多解释。

上面SQL的触发时间点是统计信息收集时段,表数据块在buffer cache的量减少,触发了Direct path read后,就很难再回到从前了。除非对表“瘦身”,简单的delete还不行,必须是高水位的降低(truncate或delete +shrink)。文章最后有改参数的方法。

2. 案例2

这是一个来自网上的案例,某业务系统数据库升级,重启后IO负载超高(重启不一定包治百病,也有时可能让你病重),分析AWR发现是某个表频繁的全表扫描导致,用户将表历史数据归档临时解决这个问题。

案例分析与点评

文章作者当时并没有意识到这就是一个典型的direct path read导致的问题。数据库重启前,数据量逐渐增长,虽然到了Direct path read的阀值,但是大量数据仍在数据库缓存(buffer cache),没有触发;数据库重启,数据库缓存被清空,触发了direct path read,导致了故障的发生。没有把这个根本原因找到,以后其他表还是有可能遇到相同的问题。

如何判断direct path read导致的性能问题:

如果数据库变慢,IO吞吐量突然急剧增长(存储或OS监控发现),十有八九可能遇到了direct path read的问题。

如果AWR报告显示每秒的Read IO非常高,而且Top Event里面的Direct path read等待事件占DB time比例较高,就可以断定发生了Direct Path Read问题(注:这个判断一般是针对OLTP系统,OLAP里面direct path read高,很可能是正常的)

总结与建议:

通过上面介绍,我们了解到Direct path read这个功能的设计初衷是为了提高数据库的整体性能。但是如果不合理的使用(频繁访问的表没有索引,或是业务不合理,表逐渐增大,突然爆发),就非常有可能遇到严重的性能问题。怎么办?

建议:

oracle每次升级新版本都会带来一些性能上的改进,如果用的不好,反而会带来负面影响,成为数据库性能“杀手”。

如果能定期分析AWR,提前发现Top SQL存在的隐患,Direct path Read这个功能还是有必要保留的,前提是需要对数据库做精细化的管理,可以把“杀手”变成帮手。

但是目前绝大多数数据库维护现状是不如人意的,这种情况还是建议把这个参数关闭:

alter system set "_serial_direct_read"=never;

文章知识点与官方知识档案匹配,可进一步学习相关知识

[转帖]警惕Oracle数据库性能“隐形杀手”——Direct Path Read的更多相关文章

  1. 文献综述九:Oracle数据库性能模型的研究

    一.基本信息 标题:Oracle数据库性能模型的研究 时间:2018 出版源:数字技术与应用 文件分类:对框架的研究 二.研究背景 帮助运维人员分析数据库性能,发现问题,指导调优. 三.具体内容 文献 ...

  2. oracle数据库性能优化方案精髓整理收集回想

    oracle数据库性能优化整体法则: 一.降低数据訪问(降低硬盘房訪问次数) 二.返回更少的数据(降低网络传输或磁盘訪问) 三.降低交互次数(降低网络传输) 四.降低server开销(降低cpu及内存 ...

  3. Jemeter对Oracle数据库性能测试方法

    下载Oracle的jdbc数据库驱动包,注意Oracle数据库的版本,这里使用的是:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 ...

  4. 浅谈Oracle数据库性能优化的目标

    Oracle性能优化保证了Oracle数据库的健壮性,为了保证Oracle数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略.从数据库性能优化的场景来区分,可以将性能优化分为如 ...

  5. oracle数据库性能

    性能视图V$开头 V$SYSTEM_EVENT 正在等待的资源的系统信息 V$SESSION_EVENT 会话累计发生的等待事件 V$SESSION_WAIT 会话正在等待或者曾经等待的详细时间信息 ...

  6. oracle 11g禁用和强制direct path read

    一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现direct path read等待事件,如果在OLTP或者纯粹的DSS环境中,出现大量的direct path read直接路径读取, ...

  7. oracle数据库性能调优

    一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子 ...

  8. Oracle数据库性能优化基础

    1.数据处理分类OLTP,OLAP 2.Oracle特性 3.数据库优化方法论/原则 方法论:自顶向下优化和自底向上优化 3.1 自顶向下优化 3.2 自底向上优化 对于多年的老系统出现性能问题时,就 ...

  9. (转)oracle 数据库性能健康检查脚本

    转至:https://blog.csdn.net/cm_0205/article/details/100210526?utm_medium=distribute.pc_relevant_downloa ...

  10. 数据库 Oracle数据库性能优化

    --在Oacle数据库涉及到全表扫描的SQL查询(top,count)中, --现场用户删除表中大部分数据,只保留1W条数据,但是查询仍然很慢,检查磁盘IO,发现磁盘IO不是很高 --经过分析Oacl ...

随机推荐

  1. MyBatis—Spring 动态数据源事务的处理

    在一般的 Spring 应用中,如果底层数据库访问采用的是 MyBatis,那么在大多数情况下,只使用一个单独的数据源,Spring 的事务管理在大多数情况下都是有效的.然而,在一些复杂的业务场景下, ...

  2. 聊聊Llama2-Chinese中文大模型

    转载请注明出处:https://www.cnblogs.com/zhiyong-ITNote 基本简述 Llama2-Chinese 大模型:由清华.交大以及浙大博士团队领衔开发:基于200B中文语料 ...

  3. Rasa中的tracker_store和event_broker

      Rasa 中的 tracker_store 相对主流为 Redis,event_broker 相对主流为 RabbitMQ.后续为了研究学习直接将 tracker_store 和 event_br ...

  4. 容器中域名解析流程以及不同dnsPolicy对域名解析影响

    本文分享自华为云社区<容器中域名解析流程以及不同dnsPolicy对域名解析影响>,作者:可以交个朋友 . 一.coreDNS背景 部署在kubernetes集群中的容器业务通过coreD ...

  5. 昇腾CANN DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶

    本文分享自华为云社区<昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈>,作者: 昇腾CANN . 随着人工智能的快速发展,越来越多的应用场 ...

  6. AI推理实践丨多路极致性能目标检测最佳实践设计解密

    摘要:基于CANN的多路极致性能目标检测最佳实践设计解密. 本文分享自华为云社区<基于CANN的AI推理最佳实践丨多路极致性能目标检测应用设计解密>,作者: 昇腾CANN . 当前人工智能 ...

  7. GaussDB(DWS)发生数据倾斜不要慌,一文教你轻松获取表倾斜率

    摘要:GaussDB(DWS)是MPP并行架构,若表的数据存在倾斜情况,会引起一系列性能问题,影响用户体验,严重时可能会引起系统故障.因此能快速获取倾斜的表并整改是GaussDB(DWS)运维管理人员 ...

  8. KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书

    摘要:本文将基于KubeEdge项目详细分析云原生边缘计算业务过程的威胁模型并给出对应的安全加固建议. 本文分享自华为云社区<KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书> ...

  9. 带你认识三种kafka消息发送模式

    摘要:在kafka-0.8.2之后,producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率. 本文分享自华为云社区<kafka消息发送模 ...

  10. 火山引擎 DataTester 智能发布平台:智能化 A/B 实验,助力产品快速迭代

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在互联网竞争炙热的红海时代,精益开发高效迭代越来越成为成为产品竞争的利器.产品迭代过程中,如何保障高效的功能迭代安 ...