Oracle sql共享池$sqlarea分析SQL资源使用情况

遇到需要排查一个系统使用sql的情况,可以通过查询Oracle的$sql$ssssion$sqlarea进行统计排查

排查时可以先看一下$sql$session的基本信息

 select *
   from v$sql a, v$session b
  where b.SQL_ADDRESS = a.ADDRESS
    and b.SQL_HASH_VALUE = a.HASH_VALUE
    and b.SQL_CHILD_NUMBER = a.CHILD_NUMBER

$sqlarea表列意思:

引用:https://blog.csdn.net/study4034/article/details/51331120

SQL_TEXT //当前正在执行的游标的sql文本的前1000个字符

SQL_FULLTEXT //CLOB类型 整个sql文本,不用借助于V$SQL_TEXT视图来查看整个文本

SQL_ID //库缓存中的SQL父游标的标志

SHARABLE_MEM //子游标使用的共享内存的大小,bytes

PERSISTENT_MEM //子游标生存时间中使用的固定内存的总量,bytes

RUNTIME_MEM //在子游标执行过程中需要的固定内存大小,bytes

SORTS //子游标发生的排序数量

LOADED_VERSIONS // 显示上下文堆是否载入,1是,0否

USERS_OPENING // 执行这个sql的用户数

FETCHES // sql取数据的次数

EXECUTIONS //自从被载入共享池后,sql执行的次数

FIRST_LOAD_TIME // 父游标产生的时间戳

PARSE_CALLS //解析调用的次数

DISK_CALLS //读磁盘的次数

DIRECT_WRITES //直接写的次数

BUFFER_GETS //直接从buffer中得到数据的次数

APPLICATION_WAIT_TIME // 应用等待时间,毫秒

CONCURRENCY_WAIT_TIME //并发等待时间,毫秒

USER_IO_WAIT_TIME //用户IO等待时间

ROWS_PROCESSED SQL //解析sql返回的总行数

OPTIMIZER_MODE //优化器模式

OPTIMIZER_COST //优化器对于sql给出的成本

PARSING_USER_ID //第一个创建这个子游标的用户id

HASH_VALUES //解析产生的哈希值

CHILD_NUMBER //该子游标的数量

SERVICE //服务名

CPU_TIME //该子游标解析,执行和获取数据使用的CPU时间,毫秒

ELAPSED_TIME //sql的执行时间,毫秒

INVALIDATIONS //该子游标的无效次数

MODULE //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的模块名

ACTION //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的动作名

IS_OBSOLETE //标记该子游标过期与否,当子游标过大时会发生这种情况

is_bind_sensitive //不仅指出是否使用绑定变量窥测来生成执行计划,而且指出这个执行计划是否依赖于窥测到的值。如果是,这个字段会被设置为Y,否则会被设置为N。

is_bind_aware //表明游标是否使用了扩展的游标共享。如果是,这个字段会被设置为Y,如果不是,这个字段会被设置为N。如果是设置为N,这个游标将被废弃,不再可用。

is_shareable //表明游标能否被共享。如果可以,这个字段会被设置为Y,否则,会被设置为N。如果被设置为N,这个游标将被废弃,不再可用。

去Oracle的sql共享池$sqlarea查询sql的执行次数,分析SQL执行性能

EXECUTIONS :所有子游标执行SQL的次数

DISK_READS:所有子游标执行SQL需要读的硬盘次数

BUFFER_GETS :所有子游标执行SQL需要读的内存次数

ELAPSED_TIME:所有子游标执行SQL需要的时间

分析SQL执行性能

SELECT SQL_TEXT,
       SQL_FULLTEXT,
       ELAPSED_TIME,
       DISK_READS,
       BUFFER_GETS,
       EXECUTIONS,
       Round(ELAPSED_TIME / EXECUTIONS ,2),
       ROUND(DISK_READS / EXECUTIONS, 2),
       ROUND(BUFFER_GETS / EXECUTIONS , 2),
       ROUND((BUFFER_GETS - DISK_READS) / BUFFER_GETS, 2)
  FROM V$SQLAREA
 WHERE EXECUTIONS > 0
   AND BUFFER_GETS > 0
   AND (BUFFER_GETS - DISK_READS) / BUFFER_GETS < 0.8
   ORDER BY Round(ELAPSED_TIME / EXECUTIONS ,2) desc;

然后解释一下这些意义:

Round(ELAPSED_TIME / EXECUTIONS ,2):求每个游标执行SQL需要的时间

ROUND(DISK_READS / EXECUTIONS, 2):求每个游标执行SQL需要读磁盘的次数

ROUND(BUFFER_GETS / EXECUTIONS , 2):求每个游标执行SQL需要读内存的次数

ROUND((BUFFER_GETS - DISK_READS) / BUFFER_GETS, 2) :SQL命中率

所有归纳一下,就是去$sqlarea共享池查询统计,然后分析sql,上述数据越低就说明SQL执行速度越高,性能越好

原文地址:https://www.cnblogs.com/mzq123/p/10295657.html

时间: 2024-11-11 01:15:42

Oracle sql共享池$sqlarea分析SQL资源使用情况的相关文章

oracle v$sqlarea 分析SQL语句使用资源情况 确认是否绑定变量

-如何确定系统中是否存在绑定变量的情况:首先创建一个表,用于存放整理过得数据:create table t1 as select sql_text from v$sqlarea;----V$SQLAREA本视图持续跟踪所有shared pool中的共享cursor,--在shared pool中的每一条SQL语句都对应一列.本视图在分析SQL语句资源使用方面非常重要./***1.查看消耗资源最多的SQL:SELECT hash_value, executions, buffer_gets, di

ORACLE从共享池删除指定SQL的执行计划

Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划,这样在特殊情况下,就避免你要将整个SHARED POOL清空的危险情况.例如某个SQL语句由于优化器产生了错误的执行计划,我们希望优化器重新解析,生成新的执行计划,必须先将SQL的执行计划从共享池中刷出或将其置为无效,那么优化器才能将后续SQL进行硬解析.生成新的执行计划.这在以前只能使用清空共享

v$sql和v$sqlarea区别

v$sql和v$sqlarea 官方文档解释: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. Howe

使用explain来分析SQL语句实现优化SQL语句

用法:explain sql 作用:用于分析sql语句 mysql> explain select * from quser_1 where loginemail = "[email protected]"; +----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+ | id | select_

ORACLE将执行过的SQL语句存放在内存的共享池

Oracle SQL性能优化深入浅出 ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享.当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用. 为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglob

Oracle SQL 语句高版本分析

OracleSQL 语句高版本分析 1.     何为高版本 每次执行一条SQL语句时,如果其对应的当前已经存在于library cache里的一个父游标下的各个子游标都不能被该SQL语句重新使用(即共享),则会产生一个新的子游标,此时就会在V$SQL_SHARED_CURSOR里新增一行,分别描述该SQL语句不能使用当前已经存在的各个子游标的原因.当然一个父游标下的第一个子游标产生时也会在该视图上新增一行,只是各个该视图上的描述原因的列的值都为N,在V$SQL_SHARED_CURSOR行数就

oracle 入门笔记--v$sql和v$sqlarea视图(转载)

转载于作者:dbtan 原文链接:http://www.dbtan.com/2009/12/vsql-and-vsqlarea-view.html v$sql和v$sqlarea视图: 上文提到,v$sqlarea和v$sql两个视图的不同之处在于,v$sql中为每一条SQL保留一个条目,而v$sqlarea中根据sql_text进行group by,通过version_count计算子指针的个数.下面对这个问题进行一点延伸探讨. 首先介绍一下v$sql视图,v$sql视图列举了共享SQL区(S

Oracle学习之sql共享以及4031解决方法

>共享sql: 1.统一书写风格 2.使用绑定变量 >>找出没有共享的SQL语句: 在v$sql查找执行次数较小的SQL语句,观察这些SQL语句是否是经常执行的. select SQL_FULLTEXT from v$sql where EXECUTIONS=1 and sql_text like '%from t%'; select SQL_FULLTEXT from v$sql where EXECUTIONS=1 order by sql_text; --将执行次数只有一次的语句列

oracle 查询执行慢的sql,使用V$SESSION_LONGOPS分析

/OPNAME:指长时间执行的操作名.如:Table ScanTARGET:被操作的object_name. 如:tableA TARGET_DESC:描述target的内容 SOFAR:这个是需要着重去关注的,表示已要完成的工作数,如扫描了多少个块.TOTALWORK:指目标对象一共有多少数量(预计).如块的数量.UNITS: START_TIME:进程的开始时间LAST_UPDATE_TIM:最后一次调用set_session_longops的时间TIME_REMAINING: 估计还需要多