我们在做项目的时候用到最多的就是我们系统中自己所设计的表,很少关注系统自带的一些很好用的视图,下面我就列出一些Oracle中可以用到的对于监控资源消耗的视图。
常用视图说明
v$sql、v$sqlarea、v$sqltext、v$session这几个就是我所要列举的视图
v$sql与v$sqlarea差不多,记录共享sql区(share pool)中sql统计信息,如内存消耗、IO、排序操作、哈希编号等数据。不同之处在于v$sql为每一条sql保留一个条目,而v$sqlarea中根据sql_text进行group by,统计列进行sum(),通过version_count计算子指针的个数。
Sql_text相同的sql语句在sql中意义可能完全不同,此时,v$sql会有这两条完全一样的sql各自的统计信息,而在v$sqlarea中sql_text相同的2个指针会合并,执行次数,DISK_READS,BUFFER_GETS等统计信息会累加,这就是v$sqlarea的聚合作用。
v$sqltext中存储着完整的sql语言及其哈希码等。
v$session主要用来确定会话相关信息,如通过SID和SERIAL来确定一个Session、会话拥有者用户名username、会话状态、会话由哪个客户端发起、正在执行什么sql(通过sql_address、sql_hash_value、sql_id、sql_child_number确定,再借助v$sqltext就可以知道)、锁等待相关信息(如所在表、文件、块、被锁行)等。
select view_definition from v$fixed_view_definition whereview_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但该视图的源又是GV$sql,所以直接使用GV$SQL,其他两个也如此。
V$SQL视图可以显示在共享池重的所有sql语句
查询最近操作的Sql语句
select sql_text, last_load_time from v$sql
where last_load_time IS NOT NULL and sql_text like '%SELECT%' order by last_load_time desc;
涉及到的字段
v$sqlarea
sql_text: sql 语句的前1000个字符
sql_fulltext: sql语句的所有字符
sql_id:缓存在高速缓冲区中的sql父游标的唯一标识ID
sorts: 语句执行导致的排序次数
version_count:在缓存中以该语句为父语句的子游标总数
executions: 包含所有子游标在内该sql语句共执行次数
parse_calls:父游标下所有子游标解析调用次数
disk_reads: 该语句通过所有子游标导致的读磁盘次数
address:当前游标父句柄
hash_value: 该语句在library cache中的hash值
v$sqltext
address: 当前游标父句柄
hash_value:该游标在library cache中唯一hash值
高资源消耗sql
查看读硬盘多或占用内存可能多的sql
select sql_text,disk_reads,buffer_gets,parsing_scheme_name,executions
from v$sqlarea
order by disk_reads desc
单纯从v$sqlarea 中无法查出每个sql消耗的内存量,但可以借助磁盘读次数间接反映可能的消耗内存较大的sql语句,然后借助执行计划(v$sql_plan)具体查看。
查看执行次数多的sql
select sql_text,executions,parsing_schema_name
from v$sqlarea
查看排序多的sql
select sql_text,sorts,parsing_schema_name
from v$sqlarea
order by sorts desc;