sql优化--识别’低效执行’的SQL语句

oracle中有两个重要的视图:-v$SQL和v$SQLAREA。
(一)-v$SQL中记录的信息和AUTOTRACE显示的信息完全一致。视图包含如下字段信息:
[img]http://dl2.iteye.com/upload/attachment/0093/9695/d659c6e8-a9ff-3889-aa86-c154d0147ea2.jpg[/img]

第一次执行一个查询'select count(*) from emp'后查询-v$SQL视图可得到
select sql_text,executions,disk_reads,optimizer_mode,buffer_gets,hash_value
from v$sql where sql_text='select count(*) from emp'

再次执行询'select count(*) from emp'这个查询,统计信息中的物理读(DISK_READS)不再增加,因为数据已经在Buffer中存在,而BUFFER_GETS继续增加。执行次数也变为2次。
[img]http://dl2.iteye.com/upload/attachment/0093/9693/f606e207-ec7c-3e9b-8c60-1c9ddb37fe82.jpg[/img]
(二)v$sqlarea列出了共享SQL区(Shared SQL Area)中的SQL统计信息,这些SQL按照SQL文本的不同,每条会记录一行统计数据。注意这里所说的是“按照SQL文本”来进行区分,也就是说这个视图的信息可以看作是根据SQL_TEXT进行的一次汇总统计。视图包含如下字段信息:
[img]http://dl2.iteye.com/upload/attachment/0093/9697/1c1bdfb1-ae1a-3532-ac83-c04fecc8a13d.jpg[/img]
执行如下sql即可定位到低效率的sql语句。
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
  
   ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
  
   ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
  
   SQL_TEXT
  
  FROM V$SQLAREA
  
  WHERE EXECUTIONS>0
  
  AND BUFFER_GETS > 0
  
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
  
  ORDER BY 4 DESC;


*文本相同的SQL语句,在数据库中的意义可能完全不同。如数据库中存在两个用户scott和dmuser,两个用户各拥有一张数据表EMP。在不同用户情况下同样执行'select count(*) from emp'语句。查询-v$SQL视图时,由于各自查询的物理对象截然不同,对应生成两条记录;查询v$sqlarea视图,由于sql_text相同,生成一条记录。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值