动态性能视图
以下四个动态性能视图会显示关于出现在库缓存中的游标信息。
Ø v$sql_plan 提供与计划表基本上相同的信息。换句话说,它提供执行计划和由查询优化器提供的其他相关信息。几个用于标识与库缓存中的执行计划关联的游标的列,是这个视图与计划表之间唯一显著的差别。
Ø v$sql_plan_statistics 为v$sql_plan视图中的每一个操作提供执行统计,例如消耗的时间和产生的行数。本质上讲,它提供执行计划的运行时行为。这是非常有用的信息,因为v$sql_plan视图只显示查询优化器在解析阶段做出的估算和决定。因为执行统计信息的采集可能会引发不可忽略的负载(依赖于执行计划和数据库服务器运行的操作系统,负载也可能是微不足道的),默认情况下不会采集它们。要激活采集,必须将statistics_level初始化参数设置为all,或者必须将gather_plan_statistics这个hint指定在SQL语句中。要知道,因为可能出现的负载,我不推荐在系统级别修改statistics_level初始化参数的默认值。
Ø v$sql_workarea 提供关于执行游标所需的内存工作区的信息。它给出运行时内存以及估算的高效执行操作需要的内存总量信息。
Ø v$sql_plan_statistics_all 将v$sql_plan、v$sql_plan_statistics以及v$sql_workarea视图提供的信息通过一个单独的视图展现出来。通过它,可以避免手工连接多个视图。
库缓存中的游标(因此会在这些动态性能视图中显示)通过两个列来标识:address和child_number。通过address列,可以标识父游标。通过两个列一起,可以标识子游标。更常见的做法是用sql_id列替代address列来标识游标。
使用sql_id列的好处是它的值只依赖于SQL语句本身。换句话说,对于一个给定的SQL语句,sql_id永远不变(事实上,sql_id是散列函数应用于SQL语句文本的结果)。而另一方面,address列是一个指向内存中SQL语句的句柄的指针,并会随着时间而改变。
要标识一个游标,基本上来说你会面临两种搜寻方法,要么知道执行SQL语句的会话,要么知道SQL语句的文本。在两种情况下,一旦标识出子游标,就可以显示它的相关信息了。
标识子游标
你必须面对的第一种常见的情况是,试图获取关于与当前连接到实例的会话有关的SQL语句的信息。在这种情况下,可以在v$session视图上执行查找。当前执行的SQL语句是通过sql_id(或sql_address)和sql_child_number列来标识的。最近执行过的SQL语句是通过prev_sql_id(或prev_sql_addr)和prev_child_number列来标识的。
为了演示这种方法的使用,我们假设有一个名叫Curtis的用户给你打电话,抱怨说他正在苦等几分钟以前通过一个应用程序提交的一个请求。对于这个问题,直接查询v$session视图很有效,如下例所示。通过查询的输出,你知道当前他正运行着一个SQL语句(否则,status列不会是ACTIVE),并知道与这个会话关联的游标是哪个:
select status,sql_id,sql_child_number from
v$sessin where username='CURTIS';
第二种常见的情况是,你知道你想要查找更多信息的那个SQL语句的文本。在这种情况下,可以在v$sql视图上执行查找。与游标有关联的文本可以在sql_text和sql_fulltext列中找到。这两个列的区别是第一个列只通过一个VARCHAR2(1000)的值显示部分的文本,而第二个列通过CLOB类型的值显示全部文本。举例来说,如果你知道所要查找的SQL语句包含一段online
discount 的文本,就可以使用下面的查询来找出游标的标识符:
select sql_id,child_number,sql_text from
v$sql
where sql_fulltext like '%online discount%'
and sql_text not like '%v$sql%';
查询动态性能视图
要获得执行计划,可直接在v$sql_plan和v$sql_plan_statistics_all视图上执行查询。但是,还有更简单更好的方式来完成这件事:使用dbms_xplan包的display_cursor函数。如下例所示,其用法与之前讨论的调用display函数相似。唯一的区别是将标识要显示的子游标的两个参数传递给这个函数:
select * from
table(dbms_xplan.display_cursor('ihqjydsjbvmwq',0));
display_cursor函数并不限于使用两个参数标识一个子游标。出于这个原因,本章稍后会讲到dbms_xplan包,来探索所有的可能性,包括对生成的输出的描述。




