1、v$sqltext
存储的是完整的sql,但是sql语句是被分割的
2、v$sqlarea
存储的sql和一些相关信息,比如累计的执行次数,逻辑读,物理读等统计信息
3、v$sql
存储的是具体的sql和执行计划相关信息,实际上,v$sqlarea可以看做v$sql 根据sqltext 做了group by以后的信息
补充:
1.查询一下这些视图的定义你就能理解,他们的源是一个
select * from v$fixed_view_definition where view_name='GV$SQL'; --GV$SQL的同义词就是V$SQL
select * from v$fixed_view_definition where view_name='GV$SQL_AREA';
2.实际上最模糊的是v$sql 和v$sqlarea 的区别和联系
a.v$sql_area相当于是按INST_ID, KGLNAOBJ, KGLHDPAR, KGLNAHSH, KGLNATIM, GLOBTS0,GLOBT19,
KGLOBTS1,KGLOBT20,DECODE(KGLOBT33, 1, 'Y', 'N'),KGLHDCLT这些列的自v$sql的group by,也就是说v$sql的每一行表示的是每一个sql语句的一个version,而v$sqlarea存放的是相同语句不同version一个汇总。
b.v$sql与v$sqlarea的源都是一个:X$KGLCURSOR
c.实际调优中建议使用v$sql,相对来说比v$sqlarea快,而且还不会产生share pool latch的争用。
3.因v$sql及v$sqlarea存放着统计信息在调优时使用居多,但其sql是不全的,如果想获得完整的sql就要用v$sqltext了。
另外注意这个
而v$SQLAREA 忽略了 执行计划等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息
Oracle服务器为当前在共享池library cache中的sql语句提供了三种查询执行统计信息的动态视图。他们是v$sql,v$sqlarea和v$sqlxs。
V$sql针对不同version的sql语句提供一条记录。这就意味着每个child cursor拥有自己的执行统计数据。
V$sqlarea针对不同sql语句提供一条记录。比如:不同的parent cursor。这就意味这个统计信息是所有child cursor之和。他不是依赖于v$sql。
V$sqlxs是v$sqlarea的简单版本。主要用来statspack产生sql报告部分。他是对v$sql的group by查询。在oracle_home/rdbms/admin/catsnmp.sql中定义。
V$sqlarea或者v$sqlxs可以用来确定按特定分类的几个top sql语句。一旦被确定,v$sql可以用来深入查看该语句不同version的统计信息。
V$sql需要更少资源比起v$sqlarea,因为他避免了group by操作,并且会产生更少的library cache latch竞争。
这是一个通用的模板。
下面来看一个实际的例子:
SELECT * FROM
(SELECT hash_value,address,substr(sql_text,1,40) sql,
buffer_gets, executions, buffer_gets/executions "Gets/Exec"
FROM V$SQLAREA
WHERE buffer_gets > 100000 AND executions > 10
ORDER BY buffer_gets DESC)
WHERE rownum <= 10;
其中:
[list of columns] = buffer_gets, executions
[list of derived values] = buffer_gets/executions
[list of threshold conditions for columns] = buffer_gets > 100000, executions > 10
[list of ordering columns] = buffer_gets
[number of top SQL statements] = 10