v$sqltext中有内存中完整的sql语句(SQL被分割为多行存储),而其他两个视图都是部分sql语句。但v$sqltext中存储的比较简单,没有该语句的统计信息,比如执行次数等。
v$sqltext 的字段如下:
其中piece表示SQL语句分片之后的顺序编号,比如三行的值为0,1,2, 按照顺序连接起来就是一个完成的SQL语句。
sql_text 表示分片后的sql语句的一部分,注意它的长度只有64 bytes . 字段HASH_VALUE 和 address 一起唯一标志一条sql 。
v$sql : 存储的是具体的SQL 和执行计划相关信息。
v$sqlarea : 存储SQL语句的前1000个bytes和一些相关的统计信息,比如累计的执行次数,逻辑读,物理读等统计信息
V$SQLAREA 在Oracle9i, Oracle10.1 和Oracle10.2 版本中字段定义都不太一样,Oracle10.2 中会多出sql_fulltext字段,
是一个CLOB字段。
实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息 。
--------------------------------------------------------------------------------------------------------------
1、可以通过以下语句查一下这些视图的定义,可以看出v$sql及v$sqlarea的源表比较接近 。
-- V$SQL 在Oracle10.2.0.4 中的定义:
--V$SQLAREA 在Oracle10.2.0.4 中的定义:
--V$SQLTEXT 在Oracle10.2.0.4 中的定义:
2、v$sql与v$sqlarea的区别与联系 :
a、v$sqlarea相当于是按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一个汇总
(相同语句只有一行记录,但是version_count记录了次数)。
b、实际调优中建议使用v$sql, 相对来说比v$sqlarea快,而且还不会产生share pool latch的争用。
3、因v$sql及v$sqlarea存放着统计信息在调优时使用居多,但其sql是不全的,如果想获得完整的sql就要用v$sqltext了。