利用statspack来获取生成环境中top SQL及其执行计划

作者: fuyuncat

来源: www.HelloDBA.com


在一些特殊情况下,生产环境中top SQL会让DBA捉摸不定。比如一个由复杂分支条件所生成的动态语句;第三方软件或者代码本身对会话环境进行了修改,导致无法正确重现问题语句的查询计划;语句过长导致无法获取正确的全部语句,等等。这时,我们可以考虑设置statspack为更高级别(默认级别为5),以获取相关语句的详细信息。具体过程如下:

获取级别6的statspack的快照:

SQL> exec statspack.SNAP(i_snap_level => 6);

N分钟后….

SQL> exec statspack.SNAP(i_snap_level => 6);

获取statspack报告

SQL> @?/rdbms/admin/spreport.sql
 
... …
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.
 
 
 
Listing all Completed Snapshots
 
                                                       Snap
Instance     DB Name        Snap Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- --------------------
edgar        EDGAR                1 28 Dec 2005 15:32     5
 
                                 11 03 Jan 2006 09:54     5
                                 12 03 Jan 2006 09:54     5
 
                                 21 11 May 2007 13:33     6
                                 31 11 May 2007 13:34     6

在选取快照时,可以看到我们刚才生成的两个快照级别为6。

查看报告,可以看到报告内容比我们普通的statspack报告更加详细(这些不是本文重点,不做具体解释)。仔细观察top SQL部分,你会发现报告中多出了一列“Old Hash Value”,找到你需要的语句,记下它的这个hash值。

    CPU                  CPU per             Elapsd                   Old
  Time (s)   Executions  Exec (s)  %Total   Time (s)    Buffer Gets  Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
     13.51           55       0.25   64.2      13.69          13,528 2547576380
Module: SQL*Plus
select a, b from ttt where b like 'aaa%'
 
… …

我们用Oracle提供的另一个statspack 报告脚本来生成这条SQL的报告:

SQL> @?/rdbms/admin/sprepsql.sql
 
… …
Listing all Completed Snapshots
 
                               Snap                    Snap
Instance     DB Name             Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- --------------------
edgar        EDGAR                1 28 Dec 2005 15:32     5
 
                                 11 03 Jan 2006 09:54     5
                                 12 03 Jan 2006 09:54     5
 
                                 21 11 May 2007 13:33     6
                                 31 11 May 2007 13:34     6
 
… …

还是选择刚才的两个快照:

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 21
Begin Snapshot Id specified: 21
 
Enter value for end_snap: 31
End   Snapshot Id specified: 31
 

这儿要求输入hash值,把刚才得到的hash值输入:

 
Specify the old (i.e. pre-10g) Hash Value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for hash_value: 2547576380
 

生成了SQL报告,看下报告,里面有SQL的完整语句和它的查询计划。

SQL Text
~~~~~~~~
select a, b from ttt where b like 'aaa%'
 
Plans in shared pool between Begin and End Snap Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Shows the Execution Plans found in the shared pool between the begin and end
snapshots specified.  The values for Rows, Bytes and Cost shown below are those
which existed at the time the first-ever snapshot captured this plan - these
values often change over time, and so may not be indicative of current values
-> Rows indicates Cardinality, PHV is Plan Hash Value
-> ordered by Plan Hash Value
 
--------------------------------------------------------------------------------
| Operation                      | PHV/Object Name     |  Rows | Bytes|   Cost |
--------------------------------------------------------------------------------
|SELECT STATEMENT                |     2 |   60    |      |     56 |
|  TABLE ACCESS FULL            |                     |     2 |   60 |       56 |
--------------------------------------------------------------------------------

我们有一个案例就是通过这个方法定位到问题愿意,具体参见《NLS参数设置导致的性能问题案例》

要注意的是,获取高级别的statspack报告将会消耗更多的系统性能,因此不建议将日常监控的statspack级别设置过高。

时间: 2024-07-29 22:16:40

利用statspack来获取生成环境中top SQL及其执行计划的相关文章

使用 EXPLAIN PLAN 获取SQL语句执行计划

     SQL查询语句的性能从一定程度上影响整个数据库的性能.很多情况下,数据库性能的低下差不多都是不良SQL语句所引起.而SQL语句的执行 计划则决定了SQL语句将会采用何种方式从数据库提取数据并返回给客户端,本文描述的将是如何通过EXPLAIN PLAN 获取SQL语句执行计划来获 取SQL语句的执行计划. 一.获取SQL语句执行计划的方式     1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划      2. 查询动态性能视图

浅析SQL SERVER执行计划中的各类怪相

在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解:     1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描?     2:同一条SQL语句,查询条件的取值不同,它的执行计划会一致吗?     3: 同一条SQL语句,其执行计划会变化,为什么     4: 在查询条件的某个或几个字段上创建了索引,执行计划就一定会走该索引吗?     5:同时存在几个索引,SQL语句会走那个索引?      .....................

oracle11g中 connect by 语句执行计划改变

从10.2.0.3升级到11.2.0.4的朋友,如果细心会发现,以下sql在11.2.0.4中执行效率变低(该sql主要是获取连接用户获取权限信息) select privilege#,level from sysauth$ connect by grantee#=prior privilege# and privilege#>0 start with grantee#=:1 and privilege#>0 如果你接触是Oracle版本比较多,而且还比较细心,你可能会进一步发现在11.2.0

Oracle数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误

  Oracle 数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究) 如何收集指定SQL的执行计划对开发人员来说非常重要的,这里记录下基础的收集方式,以便查阅和其他人参考. 1. 链接到sqlplus,如下图 2. 执行下面两个的命令之一 set autotrace on; (说明:打开自动分析统计,并显示SQL语句的运行结果) 3. 输入并执行要搜集执行计划的SQL语句

.NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C#来展现,但是同样适用于其他类似的OO技术平台,这些技术点可能称不上完整的技术,但是它是经验的总结,是掉过多少坑之后的觉醒,所以有必要花几分钟时间记住它,在真实的项目开发中你就知道是多么的有帮助.好了,废话不说了,进入主题. 我们在开发服务时为了调试方便会在本地进行一个基本的模块测试,你也可以认为是集

简述云计算环境中在SQL or NoSQL的取舍

关于NoSQL和SQL,众所周知,NoSQL只允许数据在受限的预定义模式访问.例如DHT (Distributed Hash Table)通过hashtable API访问.其他NoSQL数据服务访问模式同样受限.因此可扩展性和性能结构是可预测和可靠的.而在SQL中,访问模式预先是不知道的,SQL是一种通用语言,允许数据以各种方式访问,程序员也对SQL语句的执行能力控制有限. 换句话说,在SQL中,数据模型不执行特定的工作方式与数据.强调建立数据完整性.简洁性.标准化和抽象化.这对于所有大型复杂

Oracle中使用DBMS_XPLAN处理执行计划详解_oracle

DBMS_XPLAN是Oracle提供的一个用于查看SQL计划,包括执行计划和解释计划的包:在以前查看SQL执行计划的时候,我都是使用set autotrace命令,不过现在看来,DBMS_XPLAN包给出了更加简化的获取和显示计划的方式. 这5个函数分别对应不同的显示计划的方式,DBMS_XPLAN包不仅可以获取解释计划,它还可以用来输出存储在AWR,SQL调试集,缓存的SQL游标,以及SQL基线中的语句计划,实现如上的功能,通常会用到一下5个方法: 1.DISPLAY 2.DISPLAY_A

利用jquery的获取JS文件中的字符串内容_jquery

复制代码 代码如下: <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> <script type="text/javascript"> var _url = "http://www.baidu.com/cache/hps/js/hp

SQL Server 中查看SQL句子执行所用的时间

复制代码 代码如下: set statistics profile on set statistics io on set statistics time on go 你执行的SQL语句 复制代码 代码如下: go set statistics profile off set statistics io off set statistics time off 执行完后点消息即可.