Oracle v$sql,v$sqlarea,v$sqltext区别

v$sqltext中有内存中完整的sql语句(SQL被分割为多行存储),而其他两个视图都是部分sql语句。但v$sqltext中存储的比较简单,没有该语句的统计信息,比如执行次数等。

v$sqltext 的字段如下: 
ADDRESS       RAW(4 | 8)     Used with HASH_VALUE to uniquely identify a cached cursor 
HASH_VALUE    NUMBER         Used with ADDRESS to uniquely identify a cached cursor 
SQL_ID        VARCHAR2(13)   SQL identifier of a cached cursor 
COMMAND_TYPE  NUMBER         Code for the type of SQL statement (SELECT, INSERT, and so on) 
PIECE         NUMBER         Number used to order the pieces of SQL text 
SQL_TEXT      VARCHAR2(64)   A column containing one piece of the SQL text

其中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的源表比较接近 。

SELECT view_definition FROM v$fixed_view_definition WHERE view_name=‘GV$SQL‘;
SELECT view_definition FROM v$fixed_view_definition WHERE view_name=‘GV$SQLAREA‘; 
SELECT view_definition FROM v$fixed_view_definition WHERE view_name=‘GV$SQLTEXT‘;

-- V$SQL 在Oracle10.2.0.4 中的定义:

select inst_id,kglnaobj,kglfnobj,kglobt03, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16, 
kglobt08+kglobt11, kglobt10, kglobt01, decode(kglobhs6,0,0,1), decode(kglhdlmd,0,0,1), kglhdlkc, kglobt04, kglobt05, 
kglobt48, kglobt35, kglobpc6, kglhdldc, substr(to_char(kglnatim,‘YYYY-MM-DD/HH24:MI:SS‘),1,19), kglhdivc, kglobt12, 
kglobt13, kglobwdw, kglobt14, kglobwap, kglobwcc, kglobwcl, kglobwui, kglobt42, kglobt43, kglobt15, kglobt02, 
decode(kglobt32,        0, ‘NONE‘,        1, ‘ALL_ROWS‘,        2, ‘FIRST_ROWS‘,        3, ‘RULE‘,        4, ‘CHOOSE‘, 
‘UNKNOWN‘), kglobtn0, kglobcce, kglobcceh, kglobt17, kglobt18, kglobts4, kglhdkmk, kglhdpar, kglobtp0, kglnahsh, kglobt46, 
kglobt30, kglobt09, kglobts5, kglobt48, kglobts0, kglobt19, kglobts1, kglobt20, kglobt21, kglobts2, kglobt06, kglobt07, 
decode(kglobt28, 0, to_number(NULL), kglobt28), kglhdadr, kglobt29, decode(bitand(kglobt00,64),64, ‘Y‘, ‘N‘), 
decode(kglobsta, 1, ‘VALID‘, 2, ‘VALID_AUTH_ERROR‘,3, ‘VALID_COMPILE_ERROR‘, 4, 
‘VALID_UNAUTH‘, 5, ‘INVALID_UNAUTH‘, 6, ‘INVALID‘), kglobt31, substr(to_char(kglobtt0,‘YYYY-MM-DD/HH24:MI:SS‘),1,19), 
decode(kglobt33, 1, ‘Y‘, ‘N‘),  kglhdclt, kglobts3, kglobt44, kglobt45, kglobt47, kglobt49, kglobcla,  kglobcbca, kglobt22  
from   x$kglcursor_child

--V$SQLAREA 在Oracle10.2.0.4 中的定义:

select inst_id, kglnaobj, kglfnobj, kglobt03, kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6, kglobt08+kglobt11, 
kglobt10, kglobt01, kglobccc, kglobclc, kglhdlmd, kglhdlkc, kglobt04, kglobt05, kglobt48, kglobt35, kglobpc6, kglhdldc, 
substr(to_char(kglnatim,‘YYYY-MM-DD/HH24:MI:SS‘),1,19), kglhdivc, kglobt12, kglobt13, kglobwdw, kglobt14, kglobwap, 
kglobwcc, kglobwcl, kglobwui, kglobt42, kglobt43, kglobt15, kglobt02, decode(kglobt32, 0, ‘NONE‘,1, ‘ALL_ROWS‘,  2, ‘FIRST_ROWS‘, 
3, ‘RULE‘, 4, ‘CHOOSE‘, ‘UNKNOWN‘), kglobtn0, kglobcce, kglobcceh, kglobt17, kglobt18, kglobts4, kglhdkmk, kglhdpar, kglnahsh, 
kglobt46, kglobt30, kglobts0, kglobt19, kglobts1, kglobt20, kglobt21, kglobts2, kglobt06, kglobt07, 
decode(kglobt28, 0, NULL, kglobt28), kglhdadr, decode(bitand(kglobt00,64),64, ‘Y‘, ‘N‘), 
decode(kglobsta,1, ‘VALID‘, 2, ‘VALID_AUTH_ERROR‘,3, ‘VALID_COMPILE_ERROR‘, 4, ‘VALID_UNAUTH‘, 5, ‘INVALID_UNAUTH‘,6, ‘INVALID‘), 
kglobt31, kglobtt0, decode(kglobt33, 1, ‘Y‘, ‘N‘),  kglhdclt, kglobts3, kglobt44, kglobt45, kglobt47, kglobt49,  kglobcla,  
kglobcbca,  kglobt22  
from  x$kglcursor_child_sqlid  
where kglobt02 != 0

--V$SQLTEXT 在Oracle10.2.0.4 中的定义:

select inst_id,kglhdadr, kglnahsh, kglnasqlid, kgloboct, piece, name  
from x$kglna 
where kgloboct != 0

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了。

原文地址:https://www.cnblogs.com/ayumie/p/10910516.html

时间: 2024-10-14 09:27:58

Oracle v$sql,v$sqlarea,v$sqltext区别的相关文章

v$sql v$sqlarea v$sqltext

这里做个笔记,纯属是加深印象: V$SQL lists statistics on shared SQL areas without the GROUP BY clause and contains one row for each child of the original SQL text entered. Statistics displayed in V$SQL are normally updated at the end of query execution. However, fo

oracle常用SQL语句(汇总版)

Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 如果字段值里包含单引号’ 需要

Oracle 数据库SQL性能查看

作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看oracle性能的一些实用方法: 1.查询每台机器的连接数 select t.MACHINE,count(*) from v$session t group by t.MACHINE 这里所说的每台机器是指每个连接oracle数据库的服务器,每个服务器都有配置连接数据库的连接数,以websphere

Oracle之sql语句优化

项目中虽然使用了orm映射,但Oracle系统的优化还是很有价值的,这里从sql语句的角度对常用的语句做下总结. 1.from字段中的优化: Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表). 比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据. 2.where中的优化: 对可以过滤数据最多的,放到后面,原理也是Oracle执行从下到上(从右到左)的顺序. 3.使用列名替代*: 省去从字典表

【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人品牌. 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在.经典”的写ORACLE PL/SQL编程的文章-! 觉得对你有帮助,请留言与猛点推荐,谢谢. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) 本篇主要内容如下:第一章 PL/S

[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的. 本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理

ORACLE PL/SQL编程之八(一): 把触发器说透

本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系统都提供的一项技术.在O

ORACLE PL/SQL编程之八:把触发器说透

原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8

Oracle 中单引号和双引号的区别

问题产生原因: insert into t_Cluster_Showresult(Outhostname,Domainlist,Iplist,Classify) values ("2014512-7","www.renren.com\twww.baidu.com","192.168.2.1","2") 此条语句执行不成功,报错列不允许,经查,是因为双引号的问题,改成insert into t_Cluster_Showresul