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

oracle中有两个重要的视图:-v$SQL和v$SQLAREA。
(一)-v$SQL中记录的信息和AUTOTRACE显示的信息完全一致。视图包含如下字段信息:


第一次执行一个查询'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次。

(二)v$sqlarea列出了共享SQL区(Shared SQL Area)中的SQL统计信息,这些SQL按照SQL文本的不同,每条会记录一行统计数据。注意这里所说的是“按照SQL文本”来进行区分,也就是说这个视图的信息可以看作是根据SQL_TEXT进行的一次汇总统计。视图包含如下字段信息:

执行如下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相同,生成一条记录。

猜你喜欢

转载自wangjingyi.iteye.com/blog/2018861