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_valuefrom 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相同,生成一条记录。