循序渐进Oracle - 全面认识Oracle ASH

从Oracle 10g开始,Oracle引入了ASH新特性,也就是活动Session历史信息记录(Active Session History,ASH)。如果说v$session_wait_history是一小步,那么ASH则是Oracle迈出根本变革的一大步。

本文节选自<循序渐进Oracle:数据库管理、优化与备份恢复>

一、ASH概述

ASH以v$session为基础,每秒钟采样一次,记录活动会话等待的事件。因为记录所有会话的活动是非常昂贵的,所以不活动的会话不会被采样,这一点从ASH的“A”上就可以看出。采样工作由Oracle 10g新引入的一个后台进程MMNL来完成。

是否启用ASH功能,受一个内部隐含参数控制:

而采样时间同样由另一个内部隐含参数决定:

1000毫秒正好是一秒的时间。此处引用的脚本GetHparDes.sql内容如下:

SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.inst_id = USERENV ('Instance') AND y.inst_id = USERENV ('Instance') AND x.indx = y.indx AND x.ksppinm LIKE '%&par%' /

注意:隐含参数通常具有特殊的作用,一般不建议用户查询或者修改,本文大量引用隐含参数的目的只有一个,那就是希望大家知道,所有在文档中见到的限制、约束、阈值、比率都是有来源的,只要足够细心,就能找出数据库的真相,不再靠记忆来学习。

很多人可能更关心性能,如此频繁的采样是否会极大地影响数据库的性能呢?

采样的性能影响无疑是存在的,但是因为Oracle的采样工具可以直接访问Oracle10g内部结构,所以是极其高效的,对于性能的影响也非常小,这也正是Oracle提供优化或诊断工具的优势所在。

ASH信息被设计为在内存中滚动的,在需要时早期的信息是会被覆盖的。ASH记录的信息可以通过v$active_session_history视图来访问,对于每个活动session,每次采样会在这个视图中记录一行信息。

这部分内存在SGA中分配:

SQL> select * from v$sgastat where name like '%ASH%'; POOL NAME BYTES ------------ --------------- ---------- shared pool ASH buffers 6291456

注意,ASH buffers的最小值为1MB,最大值不超过30MB,大小按照以下算法分配:

Max ( Min (cpu_count * 2MB, 5% * SHARED_POOL_SIZE, 30MB), 1MB)

在以上公式中,如果SHARED_POOL_SIZE未显示设置,则限制为2%*SGA_TARGET。这一算法在Oracle 10g的不同版本中,可能不同。

根据这个算法,这里采样系统分配的ASH Buffers为6MB:

另外一个生产系统中,这一内存分配为8MB:

记录在SGA中的ASH信息,可以通过v$session_wait_history进行查询:

二、ASH报告

我们可以通过Oracle提供的工具生成ASH的报告,报告可以以几分钟为跨度对数据库进行精确分析;也可以以数小时或数天为时间跨度,为数据库提供概要分析。生成ASH报告主要可以通过两种方式。

脚本方式

调用$ORACLE_HOME/rdbms/admin/ashrpt.sql脚本,回答一系列问题之后,就可以生成一个ASH的报告,报告包括Top等待事件、Top SQL、Top SQL命令类型、Top sessions等内容,摘录部分报告内容如下。

首先使用$ORACLE_HOME/rdbms/admin/ashrpt.sql脚本:

数据库可用的采样数据:

完成一系列定义之后,ASH会将用户定义概要显示出来:

然后生成ASH报告,接下来对这个报告进行一点详细说明:

顶级用户事件(TopUser Events)部分列出了采样时段内数据库发生的显著用户等待,可以看到行级锁竞争(enq: TX - row lock contention)占用了87.82%的活动时间。

顶级后台进程事件(TopBackground Events)部分列出后台进程等待事件,对于本例没有输出:

对于顶级等待事件,接下来部分列出了相关等待时间及其参数值。根据这些参数,可以知道等待发生在哪些对象或资源上,对于不同的等待事件,P1/P2/P3列信息被完整地记录在案,在Oracle 10g之前,我们是无法在事后获得这部分信息的:

顶级服务和组件(TopService/Module),这一部分列出活动进程的用户及应用信息,通过这部分信息可以看到,活动时间最久的应用是SQL*Plus,那么也就意味着,相关SQL是通过SQL*Plus直接执行的:

顶级SQL命令类型(Top SQL Command Types)部分列出了ASH采样阶段数据库接受的命令类型,通过以下的数据注意到,采样阶段占用87.82%时间的SQL是一条UPDATE命令:

再转到Top SQL部分,引发数据库等待的SQL在此被列出,在这里看到那条引发等待的UPDATE语句排在了第一位,第二位的SQL则引发了全表扫描:

通过以上介绍我们已经能够感受到ASH的强大之处。

session及session的等待信息、进一步的SQL信息都被记录在案,并且能够通过ASH报告清晰展现,这对于追踪数据库的性能问题,发现数据库性能瓶颈提供了极大的帮助。

这在Oracle 10g之前都需要DBA去跟踪、捕获,现在Oracle帮助我们完成了这一切。

接下来列出了数据库未使用绑定变量的SQL示例(Top SQLUsing Literals),看来Oracle将绑定变量的重要性进一步提高了:

顶级会话(TopSessions)部分列举了处于等待的会话,信息包括详细的等待事件、等待用户等:

阻塞会话列表(TopBlocking Sessions)部分列举了被阻塞的会话信息,这个信息和测试追踪的信息一致,其来源同样一致:

此外还有顶级并行查询信息,在这次采样中,未有这类信息记录:

顶级数据库对象(Top DBObjects)部分则列举了相关等待具体等待的对象,对于我们测试的EYGLE表此处已经列出,数据库业务应用全表扫描的数据表也已经被列出:

顶级数据文件列表(Top DB Files)部分列出了全表扫描访问的数据文件信息:

顶级栓锁(Top Latches)部分列出Latch竞争,对于本例没有这类竞争:

活动结束时间(Activity Over Time)部分列出了各类等待的细粒度显示:

通过ASH报告可以注意到,以前需要通过用户追踪或者不易跟踪的信息,通过现在的ASH报告,可以很清晰地从始至终获得全面的信息,与以前版本比较起来,性能诊断和分析可以用“易如反掌”来形容。

EM图形方式

通过Oracle 10g Web方式的EM,可以在性能页,单击“运行ASH报告”按钮生成ASH报告,如图所示。

只要试用一下就可以感受到ASH的强大功能,OEM生成的ASH报告非常清晰和直观。ASH的概况信息如下图所示。

等待事件信息如下。

等待参数信息如下。

Top SQL等信息如下。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

Chrome开发者工具不完全指南:(三、性能篇)

 卤煮在前面已经向大家介绍了Chrome开发者工具的一些功能面板,其中包括Elements、Network、Resources基础功能部分和Sources进阶功...

432
来自专栏微服务生态

小程聊微服务-数据抽取那点事(二)

ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所...

562
来自专栏大数据挖掘DT机器学习

用python获取天气数据,并作定时播报

思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早上定时播报天气(定时任务crontab + Pyt...

4066
来自专栏吉浦迅科技

PGI OpenACC 2018版:原来你是这样的编译器

对于CUDA Fortran用户来说,PGI编译器是必然要用到的。 其实PGI编译器不仅仅可以支持Fortran,还可以支持C/C++。而对于集群用户来说,要将...

3807
来自专栏月牙寂

[以太坊源代码分析] VI. 基于p2p的底层通信(上篇)

本文转载来源自:http://blog.csdn.net/teaspring/article/details/78455046 感谢原作者teaspring...

4517
来自专栏FreeBuf

Offset2lib攻击测试:看我如何全面绕过64位Linux的内核防护

前言 免责声明:本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! 地址空间布局随机化(ASLR),在你知道目标代码或数据定位的前...

2019
来自专栏Hadoop数据仓库

HAWQ取代传统数仓实践(二)——搭建示例模型(MySQL、HAWQ)

一、业务场景         本系列实验将应用HAWQ数据库,为一个销售订单系统建立数据仓库。本篇说明示例的业务场景、数据仓库架构、实验环境、源和目标库的建立过...

2018
来自专栏PPV课数据科学社区

编程 | 用python获取天气数据,并作定时播报

思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早上定时播报天气(定时任务crontab + Pytho...

4997
来自专栏乐沙弥的世界

Oracle自动性能统计

  高效诊断性能问题,需要提供完整可用的统计信息,好比医生给病人看病的望闻问切,才能够正确的确诊,然后再开出相应的药方。Oracle数据库为系统、会话以及单独的...

810
来自专栏落影的专栏

GPUImage详细解析(八)视频合并混音

回顾 GPUImage源码解析、图片模糊、视频滤镜、视频水印、文字水印和动态图片水印GPUImage的大多数功能已经介绍完毕,这次的demo是源于简书的一位简友...

2825

扫描关注云+社区