oracle sql语句跟踪及性能分析工具实现

在网上找了一大圈,没找着合适的工具来跟踪oracle一段时间的sql。

我们的场景是打算自动化跑遍所有场景(rft)+fiddler跟踪请求+后端跟踪sql,根据结果去分析慢的请求和sql,本来awr报告也能实现,但是每次都用awr比较麻烦,想的是能够简单点,直接定位到执行慢的sql或者耗cpu的sql。

这个工具抓取的sql不是实时的,是某段时间的sql,原理也很简单,比awr的sql要简单的多,试了一把,跟awr给出的数据是一致的。

最终效果:准备操作时开启跟踪,结束操作后关闭跟踪,然后工具会提供这段时间的sql及相关指标,包括磁盘读次数、cpu、sql执行时间、解析次数、执行次数等,根据需要可以把跟踪结果保存到数据库或者导出到excel。

视图介绍

用到的视图:v$sqlarea

这个视图存放了近期执行过的sql,如果想要达到awr的效果,可以再结合dba_hist_sqlstat等相关视图进行查询。

本次用到的相关字段:

SQL_FULLTEXT:完整的sql语句,类型为lob字段,要获取内容可以使用DBMS_LOB.SUBSTR(Sql_Fulltext,2000,1)进行读取,获取sql前2000个字符;

PARSING_SCHEMA_NAME:执行sql的用户;

MODULE:执行sql的应用程序,如IIS为w3wp.exe,plsql为PL/SQL Developer;

PARSE_CALLS:解析次数,包括软解析和硬解析;

EXECUTIONS:sql执行次数;

BUFFER_GETS:读内存次数;

DISK_READS:读磁盘次数(可以结合读内存次数计算命中率);

CPU_TIME:cpu时间,微秒;

ELAPSED_TIME:sql执行时间,微秒;

LAST_ACTIVE_TIME:sql上次的活动时间。

由于v$sqlarea存放的数据都为累加值,所以要计算本次的数据的话,需要减去之前的旧数据。

实现原理

开始执行操作前,备份v$sqlarea,存放到oldtable;

获取当前系统时间,存放到sysdate;

结束操作后,备份v$sqlarea,存放到newtable。至此,准备工作就做完了,接下来就是整合数据了。

根据newtable中的last_active_time>sysdate获取本次执行过的sql,然后相关的指标数据都是newtable减去oldtable(两张表的关联字段为hash_value和address,sql_id应该也可以)。

要注意newtable中新出现的sql,所以用left join并用nvl转换一下空值。如果关心其他指标,可以根据实际情况添加字段。

如果要避免其他因素的干扰,可以只显示符合要求的sql,比如PARSING_SCHEMA_NAME=登陆用户或者MODULE=w3wp.exe等。

核心sql:

sql = "SELECT * FROM (SELECT n.parsing_schema_name AS SCHEMA,n.module AS MODULE, DBMS_LOB.SUBSTR(n.Sql_Fulltext,2000,1) AS SQL_TEXT,n.parse_calls-nvl(o.parse_calls,0) AS PARSE_CALLS,n.buffer_gets-nvl(o.buffer_gets,0) AS BUFFER_GETS,n.disk_reads-nvl(o.disk_reads,0) AS DISK_READS,n.executions-nvl(o.executions,0) AS EXECUTIONS,round((n.cpu_time-nvl(o.cpu_time,0))/1000000,2) AS CPU_TIME,round((n.cpu_time-nvl(o.cpu_time,0))/((n.executions-nvl(o.executions,0))*1000000),2) AS CPU_TIME_PER_EXE,round((n.elapsed_time-nvl(o.elapsed_time,0))/((n.executions-nvl(o.executions,0))*1000000),2) AS ELAPSED_TIME_PER_EXE " +
"FROM "+NewTable+" n " +
"LEFT JOIN "+OldTable+" o ON o.hash_value = n.hash_value AND o.address = n.address " +
"WHERE n.last_active_time > to_date(‘" + Sysdate + "‘,‘yyyy/MM/dd hh24:mi:ss‘) " +
"AND(n.executions - nvl(o.executions,0)) > 0 " +
"ORDER BY ELAPSED_TIME_PER_EXE DESC) WHERE ROWNUM<=20";

最终效果(c#版):

时间: 2024-11-08 23:40:25

oracle sql语句跟踪及性能分析工具实现的相关文章

Oracle Update 语句语法与性能分析 - 多表关联

Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create

[转] Oracle sql 语句执行过程图文分析

[原文链接]  http://nvd11.blog.163.com/blog/static/200018312201301310585758/ [原文视频]  http://www.jiagulun.com/thread-2674-1-1.html 1. 数据库文件Oracle 数据库文件大概可分为3种,分别是:控制文件(control files): 存放数据库本身物理结构信息数据文件(data files): 存放数据库数据啦~日志文件(log files):  包括重做日志文件和归档日志文

Oracle性能分析工具介绍及使用

oracle数据库级别优化分析工具介绍 当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类 一类是数据库级别的统计信息二类是os级别的统计信息 下面就分别介绍在不同的级别下,常用什么工具来收集信息帮助优化诊断 首先是oracle数据库级别优化分析工具介绍 目录: 1.statspack2.ASH3.AWR4.ORACLE EXPLAIN PLAN的总结(查询sql的执行计划)   a.autotrace   b.explain的使用 1.stats

Visual Studio代码性能分析工具

AMD CodeXL 2011年发布的AMD CodeAnalyst Performance Analyzer 现在已经被AMD CodeXL所替代.AMD CodeXL的主要目的是帮助开发者更好利用CPU, GPU和APU的计算性能,具有强大的GPU调试.CPU和GPU代码分析.及静态的OpenCL内核性能分析等能力. AMD提供了支持Windows 7.Windows 8和Linux系统的单机版CodeXL分析工具.在Visual Studio 2010,2012和2013上也有AMD Co

11个Visual Studio代码性能分析工具

软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和性能测试,从而大大简化程序员进行代码性能优化的过程.MSDN杂志2011年7月份曾发布主题为“.NET代码分析工具和技术”的那一期,让广大程序员收获颇丰.四年过去之后,这些工具又进一步做出了很多改进,同时也出现了更多的选择.本文对当前主流的一些Visual Studio代码性能分析工具进行简单的梳理

11 个 Visual Studio 代码性能分析工具

软件开发中的性能优化对程序猿来说是一个很重要的问题. 一个小问题可能成为一个大的系统的瓶颈. 可是对于程序猿来说.通过自身去优化代码是十分困难的.幸运的是.有一些很棒的工具能够帮助程序猿进行代码分析和性能測试,从而大大简化程序猿进行代码性能优化的过程.MSDN 杂志 2011 年 7 月份曾公布主题为".NET 代码分析工具和技术"的那一期.让广大程序猿收获颇丰.四年过去之后,这些工具又进一步做出了非常多改进,同一时候也出现了很多其它的选择.很多其它应用代码安全工具请点击:http:/

Java 性能分析工具

如何利用 JConsole观察分析Java程序的运行,进行排错调优 http://jiajun.iteye.com/blog/810150 如何使用JVisualVM进行性能分析 http://jiajun.iteye.com/blog/1180230 全功能的Java剖析工具(profiler) http://www.blogjava.net/mrzhangshunli/archive/2007/08/27/140088.html http://www.cnblogs.com/jayzee/p

性能分析工具-PerfView

Roslyn的PM(程序经理) Bill Chiles,Roslyn使用纯托管代码开发,但性能超过之前使用C++编写的原生实现,这有什么秘诀呢?他最近写了一篇文章叫做<Essential Performance Facts and .NET Framework Tips>里头推荐了一个性能分析工具<Improving Your App's Performance with PerfView>.PerfView能够收集Windows事件跟踪(ETW)数据来追踪程序的调用流向,这些程序

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具.它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的.在第2章,我强调了基于数据驱动的性能测试是非常重要的,我们必须测试应用的性能并理解每个指标的含义.性能分析和数据驱动非常类似,为了提升应用程序的性能,我们必须获取应用运行的相关数据.如何获取这些数据并理解它们是本章的主题.[本章重点介绍JDK中提供的性能分析工具] 操作系统工具及其分析 程序分析的起点并不