暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

display_cursor - display_awr 函数

原创 不吃草的牛_Nick 2023-11-06
779

   display_cursor 函数

display_cursor函数返回库缓存中存储的执行计划。注意,在Real Application Clusters 环境中,是无法获得远端实例中存储的执行计划的。与display函数一样,其返回值是dbms_xplan_type_table集合的实例。该函数的输入参数如下所示。

Ø  sql_id指定返回的执行计划的父游标。默认值是NULL。如果使用了默认值,就会返回当前会话执行的最后一个SQL语句的执行计划。

Ø  cursor_child_no指定子游标号,它与sql_id一起,确定返回哪个子游标的执行计划。默认值是0。如果指定了NU11,则会返回sql_id参数指定的父游标下的所有子游标。

Ø  format指定显示哪些信息。支持的值与display函数的format参数支持的值相同。此外,如果可以访问执行统计信息(换句话说,如果将statistics_level初始化参数设置为all或在SQL语句中指定了gather_plan_statistics这个hint),那么表10-4中描述的修饰符也同样受支持。默认值为typical。

 

警告 正如第2章中指出的那样,有时候v$sql视图中的sql_id 和child_number 列并不足以确定一个子游标。在这种情况下,因为bug14585499, 并且在11.2.0.3及之前的版本中,display_cursor 函数会返回错误的数据。要识别出这个问题,请在display_cursor的输出中查找以下错误信息:An uncaught error happened in prepare_sql_statement: ORA-01422: exact fetch returns more than requested number of rows

 

可以通过 display_cursor_ora-01422.sql脚本来重现这个bug。

 

要使用display_cursor函数,调用者需要在以下动态性能视图上拥有select权限:v$session、v$sql、v$sql_plan以及v$sql_plan_statistics_all。其中select_catalog_role角色和select any dictionary系统权限提供了这些权限。

 

注意 表10-4中列举的修饰符对于与查询优化器估算有关的以下列有移除的副作用:Bytes、TempSpc、Cost(%CPU)、Time。如果你希望其中一列出现在输出中,必须通过基本值或修饰符明确指定。

 

下面的例子展示一个查询使用hint gather_plan_statistics来启用执行统计信息的生成。然后会通知display_cursor函数显示最后一次执行的磁盘I/O统计信息。因为没有物理读或写发生,所以仅会显示逻辑读 (Buffers)。以下是一段来自display_cursor.sql脚本输出的摘录:

select /*+ gather_plan_statistics  */ count(pad)

FROM(select rownum AS rn, pad FROM t ORDER BY n)

WHERE rn = 1;

 

select * from table(dbms_xplan.display_cursor('dsvodt28fpsfh',0,'iostats last'));

 

    display_awr 函数

display_awr函数返回AWR中存储的执行计划。与display函数一样,其返回值是dbms_xplan_type_table集合的实例。该函数的输入参数如下所示。

Ø  sql_id 指定返回哪条SQL语句的执行计划。这个参数没有默认值。

Ø  plan_hash_value 指定要返回的执行计划的散列值。默认值是NULL。如果使用了默认值,则会返回所有与sql_id参数确定的SQL语句有关的执行计划。

Ø  db_id指定应该返回哪个数据库上执行的执行计划。默认值是NULL。如果使用了默认值,则使用当前数据库。

Ø  format 指定显示哪些信息。尽管在display函数的format参数中使用的值也同样受支持,但并不是所有的信息都能够显示出来。举例来说,因为AWR不存储有关谓词的信息,所以输出中缺少这部分。默认值是typical。

 

要使用display_awr函数,调用者至少应在以下数据字典视图上拥有select权限:dba_hist_sql_plan和dba_hist_sqltext。如果使用了db_id参数,还需要v$database视图上的select权限。其中select_catalog_role角色提供了这些权限。

 

下面的查询展示了对于一个给定的SQL语句存在多个执行计划时plan_hash_value参数的用途。注意第一个查询返回了两个执行计划,而第二个查询只返回了一个。以下是一段来自display_awr.sql脚本输出的摘录:

select * from table(dbms_xplan.display_awr('48vuyqjwpfgwg',NULL,NULL,'basic'));

select * from table(dbms_xplan.display_awr('48vuyqjwpfgwg',2966233522,NULL,'basic'));

 

有几种情况会导致一个给定的SQL语句存在多个执行计划,比如添加了一个索引或者只是因为数据(并且进而其对象统计信息)发生了变化。基本上,每次查询优化器执化的环境发生变化,都可能会生成不同的执行计划。

 

当你对一条SQL语句的性能产生疑问,而且认为该SQL在之前一段时间内的运行都没有问题时,这样的输出就有用处了。思路是,检查经过一段时间后,是否使用了多个执行计划执行过该SQL语句。如果是这样,基于可用的信息推断导致这种变化的原因可能是什么。

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论