oracle高资源消耗sql,Oracle高资源消耗SQL语句定位

Oracle SQL语句资源消耗监控最常用的系统视图有v$sql、v$sqlarea、v$sqltext和v$session。本文我们先了解这些视图的作用与区别,然后了解如何定位高资源消耗SQL语句,最后再了解一下各视图字段具体含义。

相关系统视图功能与区别

v$sql和v$sqlarea基本相同,记录了共享SQL区(share pool)中SQL统计信息,如内存消耗、IO(物理磁盘读和逻辑内存读)、排序操作、哈希ID等数据。不同之处在于v$sql为每一条SQL保留一个条目,而v$sqlarea中根据sql_text(需要注意,该处存储的为当前SQL指针的前1000个字符,也就是说这里记录的SQL可能是不完整的!)进行group by,统计列进行sum(),通过version_count计算子指针的个数。

然而,文本(sql_text)相同的SQL语句在数据库中意义可能完全不同。比如数据库中存在两个用户User1和User2,这两个用户各拥有一张数据表EMP。那么当两个用户发出查询select count(*) from emp;时各自访问自己SCHEMA中的表EMP,而两者表内容不同所以其资源消耗肯定也不同。此时,在v$sql中会有这两条完全一样的SQL各自的统计信息,而在v$sqlarea中sql_text相同的2个指针会合并起来,执行次数、DISK_READS、BUFFER_GETS等统计信息都会累加(sum),version_count会显示为2,这就是v$sqlarea的聚合作用。

v$sqltext中没有统计信息,然而却存储着完整的SQL语句及其哈希ID等。

对于这三者,我们可以使用视图v$fixed_view_definition来查看视图的源表,如下:

SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQL';

SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQLAREA';

SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQLTEXT';

注:视图名为V$SQL但该视图的源又是GV$SQL,所以直接使用GV$SQL,其他两个也如此。

通过以上3条语句可以发现,V$SQL数据来源X$KGLCURSOR_CHILD,其实数据还是来源于X$KGLOB;而V$SQLAREA数据来源X$KGLCURSOR_CHILD_SQLID本质是对X$KGLCURSOR_CHILD按照sql_id等字段分组汇总后的结果;V$SQLTEXT数据来源X$KGLNA。

v$session主要用来确定会话相关信息,如通过SID和SERIAL#来唯一确定一个session(SID可能会重复)、会话拥有者用户名USERNAME、会话状态(active:正在执行SQL语句、inactive:等待操作、killed:被杀死)、会话由哪个客户端发起(MACHINE、TERMINAL)、正在执行什么SQL(通过SQL_ADDRESS、SQL_HASH_VALUE、SQL_ID、SQL_CHILD_NUMBER确定,有这些再借助v$sqltext就能知道)、甚至上一次执行的SQL是什么(通过PREV_SQL_ADDRESS等确定)、锁等待相关信息(如所在表、文件、块、被锁行)等。

高资源消耗SQL查找定位

1)查看读硬盘多或占用内存可能多的SQL:

select sql_text, disk_reads, buffer_gets, parsing_schema_name, executions

from v$sqlarea

order by disk_reads desc;

说明:单纯从V$sqlarea中是无法查出每个SQL消耗的内存量的,但我们可以借助磁盘读次数间接反映可能的消耗内存量较大的SQL语句,然后再借助执行计划(如v$sql_plan视图)具体查看。

利用系统视图v$sqlarea,其中disk_reads是磁盘读次数,也是主要字段,剩余字段均为参考字段。其中,buffer_gets是内存读次数,parsing_schema_name是首次编译者模式名(一般与user名相同),executions是语句执行次数。

需要注意的是,v$sqlarea中sql_text可能不完整,若需要完整的则需要借助hash_value或sql_id结合v$sqltext来查看分析。

2)查看执行次数多的SQL

select sql_text, executions, parsing_schema_name

from v$sqlarea

order by executions desc;

3)查看排序多的SQL

select sql_text, sorts, parsing_schema_name

from v$sqlarea

order by sorts desc;

该处还应涉及Library Cache命中率、内存命中率等内容,暂不总结,见转载内容“Oracle调优相关的各种命中率、使用率汇总”。

相关视图重要字段

v$sqlarea

v$sql和v$sqlarea基本类似,而v$sqlarea更常用,故仅对v$sqlarea常用字段进行说明,如下(个人参考Oracle官方文档翻译的,因是最新版本,所以会跟网络上的有些出入):

SQL_TEXT:SQL语句的前1000个字符;

SQL_FULLTEXT:SQL语句的所有字符;

SQL_ID:缓存在高速缓冲区(library cache)中的SQL父游标的唯一标识ID(注,类似于hash_value,不过hash_value是4bytes而sql_id是8bytes,sql_id更精确后期可能会替代hash_value);

SHARABLE_MEM:SQL语句及其子游标占用的共享内存大小;

PERSISTENT_MEM:打开SQL语句的生命周期内所占用的固定内存大小(包含子游标);

RUNTIME_MEM:游标执行期间所占用的固定内存大小;

SORTS:语句执行导致的排序次数;

VERSION_COUNT:在缓存中以该语句为父语句的子游标总数;

LOADED_VERSIONS:缓存中载入了这条语句上下文堆(KGL heap 6)的子游标数;

OPEN_VERSIONS:父游标下打开的子游标个数;

USERS_OPENING:打开子游标的用户个数;

FETCHES:SQL语句的fetch数;

EXECUTIONS:包含所有子游标在内该SQL语句共执行次数;

USERS_EXECUTING:执行过该语句所有子游标的用户总数;

LOADS:语句被载入的总次数;

FIRST_LOAD_TIME:父游标被首次载入(编译)的时间;

PARSE_CALLS:父游标下所有子游标解析调用次数;

DISK_READS:该语句通过所有子游标导致的读磁盘次数;

DIRECT_WRITES:该语句通过所有子游标导致的直接写入次数;

BUFFER_GETS:该语句通过所有子游标导致的读缓存次数;

APPLICATION_WAIT_TIME:应用等待时间;

USER_IO_WAIT_TIME:用户I/O等待时间;

PLSQL_EXEC_TIME:PLSQL执行时间;

ROWS_PROCESSED:该SQL语句处理的总行数;

OPTIMIZER_COST:此查询优化给出的成本数;

PARSING_USER_ID:第一次解析该父语句的用户ID;

PARSING_SCHEMA_ID:第一次解析该语句SCHEMA的ID;

PARSING_SCHEMA_NAME:解析该语句的SCHEMA的NAME;

KEPT_VERSIONS:指出是否当前子游标被使用DBMS_SHARED_POOL包标记为常驻内存;

ADDRESS:当前游标父句柄(唯一指向该游标的一种地址编号);

HASH_VALUE:该语句在library cache中hash值;

PLAN_HASH_VALUE:执行计划的hash值,可依此确定两个执行计划是否相同(取代每行每字符进行比较的方式);

CPU_TIME:该语句解析、执行和fetch(取值)所消耗的CPU时间;

ELAPSED_TIME:该语句解析、执行和fetch(取值)所经过的时间;

LAST_ACTIVE_TIME:查询计划最后一次执行的时间;

LOCKED_TOTAL:所有子游标被锁的次数;

v$sqltext

ADDRESS:当前游标父句柄(唯一指向该游标的一种地址编号);

HASH_VALUE:该游标(子游标)在library cache中唯一hash值;

SQL_ID:缓存游标中该SQL的一个唯一标识值;

COMMAND_TYPE:SQL语句类型,如select、insert、update等;

PIECE:排序SQL文本的碎片数;

SQL_TEXT:包含一个完整SQL中的某一小块SQL文本字符(要完整的SQL语句需要把这些碎片组合起来);

v$session

SADDR:session地址;

SID:session标识值,常跟serial#联合唯一确定一个session(在杀进程时,有时SID会重用,造成误杀。而serial会增加但不会重复,sid 在同一个instance的当前session中是一个unique key,而sid ,serial#则是在整个instance生命期内的所有session中是unique key);

SERIAL#:会话序列号,用于在一个会话结束而另一个会话重用这该会话的SID时,唯一确定一个会话;

AUDSID:审计会话ID,可以通过audsid查询当前session的sid,select sid from v$session where audsid=userenv('sessionid');

PADDR:进程地址,关联v$process的addr字段,通过这个可以查询到进程对应的session;

USER#:同于dba_users中的user_id,Oracle内部进程user#为0;

USERNAME:会话拥有者用户名,等于dba_users中的username,Oracle内部进程的username为空;

COMMAND:正在执行的SQL语句类型,如1为create table、3为select等;

OWNERID:如果该列值为2147483644则值无效,否则值用于会话迁移、并行等;

TADDR:Address of transaction state object;

LOCKWAIT:标识当前查询是否处于锁等待状态,为空则表示无等待;

STATUS:标识session状态,Active正执行SQL语句,inactive等待操作,killed被标注为杀死;

SERVER:服务器类型,DEDICATED专用、SHARED共享等;

SCHEMA#:SCHEMA标识ID值,Oracle内部进程的schema#为0;

SCHEMANAME:SCHEMA用户名,Oracle内部进程的为sys;

OSUSER:客户端操作系统用户名;

PROCESS:客户端操作系统进程ID;

MACHINE:操作系统机器名;

TERMINAL:操作系统终端名;

PROGRAM:操作系统应用程序名,如EXE或sqlplus.exe;

TYPE:会话类型,如BACKGROUND或USER;

SQL_ADDRESS:和SQL_HASH_VALUE一起使用标识正在执行的SQL语句;

SQL_HASH_VALUE:和SQL_ADDRESS一起使用标识正在执行的SQL语句;

SQL_ID:正在执行的SQL语句的标识ID;

SQL_CHILD_NUMBER:正在执行的SQL语句的子ID;

FIXED_TABLE_SEQUENCE:当session完成一个user call后就会增加的一个数值,也就是说,如果session挂起,它就不会增加。因此可以根据这个字段来监控某个时间点以来的session性能情况。例如,一个小时前某个session的此字段数值为10000,而现在是20000,则表明一个小时内其user call较频繁,可以重点关注此session的performance statistics。

ROW_WAIT_OBJ#:被锁定行所在table的object_id,和dba_object中的object_id关联可以得到被锁定的table name;

ROW_WAIT_FILE#:被锁定行所在的datafile id,和v$datafile中的file#关联可以得到datafile name;

ROW_WAIT_BLOCK#:被锁定的块ID;

ROW_WAIT_ROW#:被锁定的当前行;

LOGON_TIME:登录时间;

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

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

相关文章

JavaScript动画知多少?

今天,小学生以自己浅薄的见地,在前辈大能的基础上写这篇文章,希望给大家打开一扇窥探JavaScript(以下简称JS)动画的窗户。 JS如何制造出动画效果? 结合浏览器提供的 setInterval 或 setTimeout API&#xf…

Socket网络编程--简单Web服务器(6)

本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了。所以这一小节就是本次的最后一节了。就简单的说几个注意点。 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息,例…

postgresql调优

http://blog.pgaddict.com/posts/performance-since-postgresql-7-4-to-9-4-pgbench硬件和系统配置操作系统Ubuntu13.04系统位数64CPUIntel(R) Core(TM)2 Duo CPU内存4G硬盘Seagate ST2000DM001-1CH164测试工具PostgreSQL-9.1.11测试工具工具名称pgbench数据量200W(…

操作系统--进程状态切换以及cpu调度(转)

http://www.cnblogs.com/coder2012/p/3204730.html 进程的状态转换 进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。 进程状态 执行态run:进程正在使用CPU等待态wait:进程正在等待I/O完成,不在使…

oracle打开当前表的编辑,oracle sqlplus常用命令

Oracle sqlplus 常用命令1、查看当前库的所有数据表:SQL> select TABLE_NAME from all_tables;select * from all_tables;SQL> select table_name from all_tables where table_name like ‘u’; TABLE_NAME———————————————default_auditing_o…

在Exchange 2010中重建Exchange安全组

问题:有时候,重新安装Exchange 2010会corrupt掉Exchange安全组,或者出现重复的组。用户在这种情况下会出现访问被拒的情况。分析:我们可以删掉这些安全组,然后最这些安全组进行重建:当你prepare ad的时候,由于OtherWel…

1023:坑爹的黑店

题目描述 今天小明去了一个风景如画的地方散心,但是自己带的饮料喝完了,小明口渴难耐,见不远处有家小商店,于是跑去买饮料。小明:“我要买饮料!”店主:“我们这里有三种饮料,矿泉水1…

php判断电脑浏览器模拟手机访问网页,在PC上测试移动端网站和模拟手机浏览器的5大方法...

查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法,测试环境winxp。一、Chrome*浏览器 chrome模拟手机总共有四种方…

带弹出列表的EditText

最近做的一个Andriod里有一个这个要求,一个东西需要输入,但同时可以在列表直接选择。看到这个需求,瞬间想到了QQ的登录界面,那个账号输入的控件正式我所需要的。 这个账号输入框右边有一个按钮,点击可以显示一个下拉列…

SICP第三章题解

目录 SICP第三章题解ex3-17ex3-18ex3-19队列ex3-21ex3-22ex3-24ex3-253.4 并发:时间是一个本质问题ex3-383.4.2 控制并发的机制ex3-39ex3-41ex3-42串行化、序列化ex3-44串行化的实现ex3-47死锁3.5 流ex3-50序列加速器SICP第三章题解 标签(空格分隔&#…

linux cp 目录不存在自动创建,linux – 如果不存在,如何cp文件和创建目录?

我想将svn存储库中的修改文件复制到另一个目录,同时保留其目录结构.在阅读awk和xargs manpage之后,我找到了一种方法来获取更改的文件名,如下所示:$svn status -q | awk { print $2 } | xargs -d \\n -I {} cp {} /tmp/xen/但问题是以这种方式不保留目录结构,我想复…

ios 中 KVO

KVO(Key value observe)键值观察,是ios中的一种核心的概念,简单的理解为当某一个对象A(或者多个对象)要想监听对象的B的一个或者多个属性发生变化时,就是用这种机制。 KVO的优点 当某个对象有个…

获取win7时区所有信息

打开命令行工具: tzutil /l# 或者输入到文件中tzutil /l > data.txt 1 # -*- utf-8 -*-2 3 """获取win7所有时区信息,并写入到sql语句中4 5 Usage: python data.py -f data.txt -o data.sql6 """7 8 if __name__ &quo…

linux kill命令信号,Linux kill 命令详解

Linux kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的。我们来看一下 man page 对它的解释:kill - send a signal to a process.从官方的解释不难看出,kill 是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号&a…

VSTO学习笔记(二)Excel对象模型

原文:VSTO学习笔记(二)Excel对象模型上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升。从这次开始,将从VSTO 4.0开始,逐一探讨VSTO开发中方方面面,本人接触VSTO…

zen-coding for notepad++,前端最佳手写代码编辑器

zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web前端从业者的利器。 zen-Coding插件支持多种编辑器,如UltraEdit,Notepad等。 温…

red hat linux 远程,Red Hat Linux 远程桌面 – 如何设置

远程访问 RHEL 计算机。运行 RHEL 7.3-8.1 的 Linux 计算机的远程桌面。从任何计算机、平板电脑或移动设备进行访问。立即免费试用!如果您是在家中或在旅途中工作,则可能需要一段时间才能在办公室或在家中访问台式计算机。如果该桌面恰巧在 Linux 操作系…

通过boundingRectWithSize:options:attributes:context:计算文本尺寸

转:http://blog.csdn.net/jymn_chen/article/details/10949279 之前用Text Kit写Reader的时候,在分页时要计算一段文本的尺寸大小,之前使用了NSString类的sizeWithFont:constrainedToSize:lineBreakMode:方法,但是该方法已经被iOS…

H264/AVC视频解码时AVC1和H264的区别

AVC1与H264的区别http://blog.csdn.net/qiuchangyong/article/details/6660253H.264 Video TypesThe following media subtypes are defined for H.264 video.Subtype FOURCC DescriptionMEDIASUBTYPE_AVC1 AVC1 H.264 bitstream without start codes.MEDIASUBTYPE…

Linux命令行显示无效的命令,LINUX 命令ifconfig 无效

在安装完成linux后,进入终端,输入命令行ifconfig,会提示bash: ifconfig: command notfound。这是因为在我们的环境变量里,还没有设置完整变量。如果我们输入/sbin/ifconfig或/usr/bin/gcc就可以执行命令行。为了不输入命令行的完整…