使用AWR生成一条sql的执行统计报告

我们都知道Oracle的AWR报告是一个很强大的功能通过分析AWR报告可以打出Oracle数据运行过程中出现的问题和可能存在的隐患。但是AWR报告中没有关于单个SQL执行计划、统计信息的详细描述,但不代表AWR不能提供这种功能。

本文介绍的是如何使用AWR报告生成一条sql的详细执行统计报告。

实验环境11.2.0.4

1、调整AWR关于SQL收集的设置,调整的目的是因为默认情况下AWR并非捕获所有的sql语句,此调整是为了让AWR可以收集实验过程中的SQL语句

[email protected]>select * from dba_hist_wr_control;

      DBID SNAP_INTERVAL							       RETENTION								   TOPNSQL
---------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ------------------------------
1444351641 +00000 01:00:00.0							       +00008 00:00:00.0							   DEFAULT

[email protected]>exec dbms_workload_repository.modify_snapshot_settingS(topnsql=>‘MAXIMUM‘);

PL/SQL procedure successfully completed.

[email protected]>select * from dba_hist_wr_control;

      DBID SNAP_INTERVAL							       RETENTION								   TOPNSQL
---------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ------------------------------
1444351641 +00000 01:00:00.0							       +00008 00:00:00.0							   MAXIMUM

2、手工创建一个AWR快照

[email protected]>exec dbms_workload_repository.create_snapshot;

PL/SQL procedure successfully completed.

3、创建测试表并在不同情况下执行测试sql,并找到测试sql的sql_id

[email protected]>create table t as select * from dba_objects;

Table created.

[email protected]>create unique index idx_unique_t on t(object_id);

Index created.

[email protected]>exec dbms_stats.gather_table_stats(USER,‘T‘,CASCADE=>TRUE);

PL/SQL procedure successfully completed.

[email protected]>select object_name from t where object_id=123;

OBJECT_NAME
------------------------------
ECOL$

[email protected]>select sql_id,sql_text from v$sql where sql_text=‘select object_name from t where object_id=123‘;

SQL_ID					SQL_TEXT
-------------------                     -----------------------------------------------
2dymmcx3kf7h1				select object_name from t where object_id=123

4、再次手工生成AWR快照

[email protected]>exec dbms_workload_repository.create_snapshot;

PL/SQL procedure successfully completed.

5、使用awrsqrpt.sql脚本生成对于sql_id=2dymmcx3kf7h1的sql的详细统计信息。过程与生成awrrpt类似,不同的是需要指定要生成报告的sql_id

[email protected]>@?/rdbms/admin/awrsqrpt

Current Instance
~~~~~~~~~~~~~~~~

   DB Id    DB Name	 Inst Num Instance
----------- ------------ -------- ------------
 1444351641 ORCL		1 orcl

Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter ‘html‘ for an HTML report, or ‘text‘ for plain text
Defaults to ‘html‘
Enter value for report_type: text

Type Specified: 				 text

Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   DB Id     Inst Num DB Name	   Instance	Host
------------ -------- ------------ ------------ ------------
* 1444351641	    1 ORCL	   orcl 	rhel6

Using 1444351641 for database Id
Using	       1 for instance number

Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed.  Pressing <return> without
specifying a number lists all completed snapshots.

Enter value for num_days: 1

Listing the last day‘s Completed Snapshots

							Snap
Instance     DB Name	    Snap Id    Snap Started    Level
------------ ------------ --------- ------------------ -----
orcl	     ORCL		826 15 Feb 2017 09:25	   1
				827 15 Feb 2017 10:00	   1
				828 15 Feb 2017 10:00	   1
				829 15 Feb 2017 10:04	   1
				830 15 Feb 2017 10:09	   1
				831 15 Feb 2017 11:00	   1
				832 15 Feb 2017 11:02	   1
				833 15 Feb 2017 11:07	   1

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 832
Begin Snapshot Id specified: 832

Enter value for end_snap: 833
End   Snapshot Id specified: 833

Specify the SQL Id
~~~~~~~~~~~~~~~~~~
Enter value for sql_id: 2dymmcx3kf7h1
SQL ID specified:  2dymmcx3kf7h1

Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrsqlrpt_1_832_833.txt.  To use this name,
press <return> to continue, otherwise enter an alternative.

Enter value for report_name: 

Using the report name awrsqlrpt_1_832_833.txt

WORKLOAD REPOSITORY SQL Report

Snapshot Period Summary

DB Name 	DB Id	 Instance     Inst Num Startup Time    Release	   RAC
------------ ----------- ------------ -------- --------------- ----------- ---
ORCL	      1444351641 orcl		     1 15-Feb-17 09:14 11.2.0.4.0  NO

	      Snap Id	   Snap Time	  Sessions Curs/Sess
	    --------- ------------------- -------- ---------
Begin Snap:	  832 15-Feb-17 11:02:01	27	 1.3
  End Snap:	  833 15-Feb-17 11:07:24	29	 1.5
   Elapsed:		   5.38 (mins)
   DB Time:		   0.06 (mins)

SQL Summary				    DB/Inst: ORCL/orcl	Snaps: 832-833

		Elapsed
   SQL Id      Time (ms)
------------- ----------
2dymmcx3kf7h1	       1
Module: SQL*Plus
select object_name from t where object_id=123

	  -------------------------------------------------------------

SQL ID: 2dymmcx3kf7h1			    DB/Inst: ORCL/orcl	Snaps: 832-833
-> 1st Capture and Last Capture Snap IDs
   refer to Snapshot IDs witin the snapshot range
-> select object_name from t where object_id=123

    Plan Hash		Total Elapsed		      1st Capture   Last Capture
#   Value		     Time(ms)	 Executions	  Snap ID	 Snap ID
--- ---------------- ---------------- ------------- ------------- --------------
1   3476657867			    1		  1	      833	     833
	  -------------------------------------------------------------

Plan 1(PHV: 3476657867)
-----------------------

Plan Statistics 			    DB/Inst: ORCL/orcl	Snaps: 832-833
-> % Total DB Time is the Elapsed Time of the SQL statement divided
   into the Total Database Time multiplied by 100

Stat Name				 Statement   Per Execution % Snap
---------------------------------------- ---------- -------------- -------
Elapsed Time (ms)				  1	       0.8     0.0
CPU Time (ms)					  0	       0.0     0.0
Executions					  1	       N/A     N/A
Buffer Gets					  3	       3.0     0.0
Disk Reads					  0	       0.0     0.0
Parse Calls					  1	       1.0     0.1
Rows						  1	       1.0     N/A
User I/O Wait Time (ms) 			  0	       N/A     N/A
Cluster Wait Time (ms)				  0	       N/A     N/A
Application Wait Time (ms)			  0	       N/A     N/A
Concurrency Wait Time (ms)			  0	       N/A     N/A
Invalidations					  0	       N/A     N/A
Version Count					  1	       N/A     N/A
Sharable Mem(KB)				 15	       N/A     N/A
	  -------------------------------------------------------------

Execution Plan
--------------------------------------------------------------------------------------------
| Id  | Operation		    | Name	   | Rows  | Bytes | Cost (%CPU)| Time	   |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	    |		   |	   |	   |	 2 (100)|	   |
|   1 |  TABLE ACCESS BY INDEX ROWID| T 	   |	 1 |	30 |	 2   (0)| 00:00:01 |
|   2 |   INDEX UNIQUE SCAN	    | IDX_UNIQUE_T |	 1 |	   |	 1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Full SQL Text

SQL ID	     SQL Text
------------ -----------------------------------------------------------------
2dymmcx3kf7h select object_name from t where object_id=123

Report written to awrsqlrpt_1_832_833.txt

报告中列出了AWR记录中sql执行的统计信息和执行计划。

参考:http://blog.csdn.net/leshami/article/details/8732708

http://www.linuxidc.com/Linux/2013-01/77196.htm

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_workload_repos.htm#ARPLS69140

《基于Oracle的SQL优化》

时间: 2024-12-12 05:26:11

使用AWR生成一条sql的执行统计报告的相关文章

[lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {"packId","itemId","`group`","num","rate","rateType"}, } for k, v in pairs(t) do if tname == k then r

Oracle 11g如何清除share pool中某条SQL的执行计划

以前在10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(总不能alter system flush shared_pool),只能通过对表ddl使SQL硬解析.现在终于找到了,使用sys.dbms_shared_pool.purge,在11g下可以直接使用,但在10g上需要alter session set events '5614566 trace name context forever'.

如何清除某条SQL的执行计划

如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(除非alter system flush shared_pool),只能通过对表ddl使SQL硬解析.现在终于找到了,使用sys.dbms_shared_pool.purge 在11g下可以直接使用,但在10g上需要 alter session set events '5614566 trace name context forever'   --特定游标对象 S

Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

Oracle 是如何工作的? Select id,name from t order by id ; – SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限) – 执行计划(ORACLE如何访问数据,按照执行计划取数据) – 执行SQL • 从磁盘中读取数据(如果数据在内存中没有,就去磁盘读取) • 数据处理(数据读到内存后,就进行处理.排序,组合等处理) • 返回结果(把结果返回给用户) Insert into t values(1,‘tigerfish’); – SQL

腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列

说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯面试的实话,也问到这个问题了,不过答的很不好,之前没去想过相关原因,导致一时之间扯不出来.所以今天,我带大家来详细扯一下有哪些原因,相信你看完之后一定会有所收获,不然你打我. 一.开始装逼:分类讨论 一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们

统计mysql里每条SQL语句执行的时间

概述 通常为了测试一些工具的性能,不得不用数据说话.数据可以客观地证实一些东西.例如关于一些数据库中间件的性能,对于一个初学者来说只会看到表面上的夸词.我们不得不去证实,那就用具体的查询语句测试.然而每每在执行完一条语句,眼巴巴的看着黑屏一类的客户端,不由得打瞌睡走神,统计起来也头疼. 方法 打开mysql客户端 mysql -h127.0.0.1 -uroot -proot -P3306 选择数据库 use dbtest; 设置profiling set profiling=1; 执行SQL语

mysql-一条sql的执行过程

1,登陆账号,链接上服务器. 2,取账号权限 3,(分析器)分析sql,是否符合语法.表名,是否存在,涉及表字段是否正确等等 4,(优化器)优化sql,是否需要使用索引.多个索引存在的情况下,哪个索引最合适.join 链接查询的话,先从哪个表开始比对等等 5,(执行器)查看是否有搜索涉及表的权限.执行sql.全表,或者索引树,一条一条比对下去 注意:账号权限在登陆时已经获取到了.登陆成功之后修改账号的密码不会影响已经建立链接的操作. 登陆账号之后建立了一个链接,链接长时间不使用的话,链接失效(w

一条SQL语句执行得很慢的原因有哪些?

参考: https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485185&idx=1&sn=66ef08b4ab6af5757792223a83fc0d45&chksm=cea248caf9d5c1dc72ec8a281ec16aa3ec3e8066dbb252e27362438a26c33fbe842b0e0adf47&token=79317275&lang=zh_CN#rd 原文地址:htt

mysql(1)—— 详解一条sql语句的执行过程

SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL语句的底层实现不同罢了,但结果相同.这有点类似于java中接口的作用,一个接口可以有不同的实现类,不同的实现类对于接口中方法的实现方式可以不同,结果可以相同.这里SQL语言的作用就类似于java中的接口,数据库就类似于java中接口的实现类,SQL语句就类似于java接口中的方法.不同的是java中