v$sql、v$sqlarea、v$sqltext、v$sql_plan的联系与区别

对于同一个SQL语句,如果在不同环境下使用了不同的优化器目标的情况下,会有不同的执行计划,
这样就要求分别有一个独立的游标(即子游标)来区别出每一种情况下的不同的运行行为。

Oracle用v$sqlarea中一行保存同样语句的SQL,并用字段version_count的值来指出子游标的个
数,而在v$sql里面为每个子游标保留了一个单独的行。两个表可以通过字段address和hash_value
相互对应。例如下面例子:
SQL> select address,hash_value,sql_text,version_count from v$sqlarea where sql_text like 'select value$ from sys.props%';

ADDRESS          HASH_VALUE SQL_TEXT                                                          VERSION_COUNT
---------------- ---------- ----------------------------------------------------------------- -------------
00000003C15F6DB8 3393782897 select value$ from sys.props$ where name = :1                                 3
00000003C1933FE0 3319354662 select value$ from sys.props$ where name = 'DEFAULT_TBS_TYPE'                 1

SQL> select address,hash_value,child_address,child_number,sql_text from v$sql where sql_text like 'select value$ from sys.props%';

ADDRESS          HASH_VALUE CHILD_ADDRESS    CHILD_NUMBER SQL_TEXT
---------------- ---------- ---------------- ------------ -----------------------------------------------------------------
00000003C15F6DB8 3393782897 00000003C15F5E88            0 select value$ from sys.props$ where name = :1
00000003C15F6DB8 3393782897 00000003C17E9808            1 select value$ from sys.props$ where name = :1
00000003C15F6DB8 3393782897 00000003C18D3C58            2 select value$ from sys.props$ where name = :1
00000003C1933FE0 3319354662 00000003C1622F20            0 select value$ from sys.props$ where name = 'DEFAULT_TBS_TYPE'

如果想找出这个SQL语句的执行计划,也可以通过字段address、hash_value和child_number到v$sql_plan中查找,

v$sql_plan中是区分了不同子游标的执行计划的

SQL> select address,child_number,lpad('',2*level)||operation||decode(id,0,' cost='||position) op, options,object_name from v$sql_plan t where hash_value=3319354662;

视图v$sqltext中没有SQL语句的相关统计信息,但是v$sqltext用多行来保存sql语句,而v$sqlarea中只能
保存sql语句的前1000个字节,所以如果sql语句大于1000个字节,就要到v$sqltext中查看完整的语句,其字
段PIECE表示每个sql的行顺序。


v$sqlarea --------- 存储的SQL 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息
v$sql ---------- 存储的是具体的SQL 和执行计划相关信息,实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息
v$sqltext---------分片之后按顺序编号保存sql,存储的是完整的SQL,SQL被分割
v$sql_plan-------即使相同的sql,也可能具有不同的执行计划

v$sql join to v$sql_plan 就代表了具体的sql的执行计划,通过下面3个字段做连接

ADDRESS RAW(4)
HASH_VALUE NUMBER
CHILD_NUMBER NUMBER

而v$SQLAREA 忽略了 执行计划 等差异,只是在形式上sql文本看起来一样!相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息

你可能感兴趣的:(v$sql)