oracle select v$sql,Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的联系与区别

对于同一个SQL语句,如果在不同环境下使用了不同的优化器目标的情况下,会有不同的执行计划,

这样就要求分别有一个独立的游标(即子游标)来区别出每一种情况下的不同的运行行为。[@more@]

Oracle用v$sqlarea中一行保存同样语句的SQL,并用字段version_count的值来指出子游标的个

数,而在v$sql里面为每个子游标保留了一个单独的行。两个表可以通过字段address和hash_value

相互对应。例如下面例子:

SQL> select address,hash_value,sql_text,version_count

2  from v$sqlarea where sql_text like 'select value$ from sys.props%';

ADDRESS  HASH_VALUE SQL_TEXT                                       VERSION_COUNT

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

97F1C9C4  563046721 select value$ from sys.props$ where name = :1   3

SQL> select address,hash_value,child_address,child_number,sql_text

2  from v$sql where sql_text like 'select value$ from sys.props%';

ADDRESS  HASH_VALUE CHILD_ADDRESS CHILD_NUMBER SQL_TEXT

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

97F1C9C4  563046721 97F1C448                 0 select value$ from sys.props$ where name = :1

97F1C9C4  563046721 97EAD3B0                 1 select value$ from sys.props$ where name = :1

97F1C9C4  563046721 97E7EEF0                 2 select value$ from sys.props$ where name = :1

如果想找出这个SQL语句的执行计划,也可以通过字段address、hash_value和child_number到v$sql_plan中查找,

v$sql_plan中是区分了不同子游标的执行计划的

SQL> select address,child_number,lpad('',2*level)||operation||decode(id,0,' cost='||position) op,

2         options,object_name

3    from v$sql_plan t where address='97F1C9C4' and hash_value=563046721;

ADDRESS  CHILD_NUMBER OP                        OPTIONS     OBJECT_NAME

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

97F1C9C4            2 SELECT STATEMENT cost=0

97F1C9C4            2 TABLE ACCESS              FULL        PROPS$

97F1C9C4            1 SELECT STATEMENT cost=0

97F1C9C4            1 TABLE ACCESS              FULL        PROPS$

97F1C9C4            0 SELECT STATEMENT cost=0

97F1C9C4            0 TABLE ACCESS              FULL        PROPS$

视图v$sqltext中没有SQL语句的相关统计信息,但是v$sqltext用多行来保存sql语句,而v$sqlarea中只能

保存sql语句的前1000个字节,所以如果sql语句大于1000个字节,就要到v$sqltext中查看完整的语句,其字

段PIECE表示每个sql的行顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值