共享池之SQL

--共享池中保留区的信息查询

select * from v$shared_pool_reserved

--查询hard parse比率

select a.value as Total,b.value as "Hard Pase",

round(b.value/a.value,2) as Ratio

from v$sysstat a,v$sysstat b

where a.name=‘parse count(total)‘ and b.name=‘parse count(hard)‘;

--查询哪些SQL语句没有使用绑定变量

select d.plan_hash_value plan_hash_value,

d.execnt execnt,

a.hash_value hash_value,

a.sql_text sql_text

from v$sqltext a,

(select plan_hash_value,hash_value,execnt

from (select c.plan_hash_value,

b.hash_value,

c.execnt,

rank() over(partition by c.plan_hash_value order by

b.hash_value) as hashrank

from v$sql b,

(select count(*) as execnt,plan_hash_value

from v$sql

where plan_hash_value <>  0

group by plan_hash_value

having count(*)>10

order by count(*) desc) c

where b.plan_hash_value=c.plan_hash_value

group by c.plan_hash_value,b.hash_value,c.execnt)

where hashrank<=3) d

where a.hash_value=d.hash_value

order by d.execnt desc,a.hash_value,a.piece;

--调整共享池大小参考视图

select * from v$shared_pool_advice

--查询保留区的统计信息

select * from V$shared_Pool_Reserved

--确认shared_pool_reserved_size的空间情况

select round(free_space/1024/1024,1) "FREE SPACE MB",

request_misses,

request_failures

from v$shared_pool_reserved

--确认shared_pool_reserved_size的命中率(以上结果应该都要小于1%),否则应该加大shared_pool_reserved_size

select (request_misses/(requests+0.0001))*100 "REQUEST MISSES RATIO",

(request_failures/(requests+0.0001))*100 "REQUEST FAILURES RATIO"

from v$shared_pool_reserved

--对象在库缓存中消耗的内存

select substr(owner,1,10) owner,

substr(type,1,12) type,

substr(name,1,20) name,

executions,

sharable_mem "MEMORY USED",

substr(kept||‘ ‘,1,4) "KEEP"

from v$db_object_cache

where type in(‘TRIGGER‘,‘PROCEDURE‘,‘PACKAGE BODY‘,‘PACKAGE‘)

order by executions desc;

--查询对象被加载的次数,以及是否被保留到内存内

select owner,name sharable_mem,kept,loads

from v$db_object_cache

where loads>1

order by loads desc;

--使用内存超出了5MB,但并没有被保留在内存内

select owner,name,sharable_mem,kept

from v$db_object_cache

where sharable_mem>51200

and kept=‘NO‘

order by sharable_mem desc;

--利用v$sql查询出使用频率最高的10句sql

select sql_text,executions

from (select sql_text,executions,rank() over(order by executions desc) exec_rank

from v$sql)

where exec_rank<=10

--利用v$sql查询出最耗费磁盘读的前10句SQL

select disk_reads,sql_text

from (select sql_text,disk_reads,dense_rank() over(order by disk_reads desc) disk_reads_rank

from v$sql)

where disk_reads_rank<=10

--利用v$sql查询出最耗费内存的前10句逻辑读SQL

select buffer_gets,sql_text

from (select sql_text,buffer_gets,dense_rank() over(order by buffer_gets desc) buffer_gets_rank

from v$sql)

where buffer_gets_rank<=10

--利用v$sqlarea查出消耗资源最多的sql的hash_value

select hash_value,executions,buffer_gets,disk_reads,parse_calls

from v$sqlarea

where buffer_gets>10000000 or disk_reads>1000000

order by buffer_gets+100*disk_reads desc

--得到hash_value后,再利用v$sqltext查询出实际的sql语句

select address,hash_value,piece,sql_text

from v$sqltext

where hash_value=‘2450129223‘

order by piece;

--利用v$sqlarea查询出磁盘读次数超过100000的查询语句,也就是最耗资源的SQL

select b.username "USER NAME",

a.disk_reads "DISK READ",

a.executions EXECUTIONS,

a.disk_reads/decode(a.executions,0,1,a.executions) "READ_EXEC%",

a.sql_text "SQL TEXT"

from v$sqlarea a,dba_users b

where a.parsing_user_id=b.user_id

and a.disk_reads>100000

order by a.disk_reads desc

--利用v$sql查出查询的SQL语句的address和hash_value

select sql_text,address,hash_value from v$sql

where sql_text like ‘SELECT * from EMP %‘;

--利用查出的address和hash_value,配合v$sql_plan相对应的字段,即可查询出此SQL语句的执行计划

select operation,options,object_name,cost from v$sql_plan

where address=‘325576612‘ and hash_value=2234134134

--命中率

select namespace,gets,gethitratio*100 "GET%",

pins,pinhitratio*100 "PIN%",reloads

invalidations

from v$librarycache;

时间: 2024-12-10 21:45:21

共享池之SQL的相关文章

Oracle 共享池和数据库高速缓冲区,引出SQL执行过程

共享池在数据库中可以说是相当重要动力资源,关系着数据库的性能瓶颈. 什么是共享池呢? 共享池是内存结构中SGA(系统全局区)的一部分,包含了:库缓冲区.数据字典缓冲区.服务器结果缓冲区.预留池,也是着四个区组成了共享池,这四个区的功能就是共享池的功能. 库缓冲区 共享SQL区:存放执行计划和解析树,当用户执行一条SQL语句时,共享池会根据SQL语句的复杂程度分出一定的内存给用户,当用户再次执行相同的SQL语句时,不必再次进行解析,提高执行语句的执行效率.类似于古代将领带兵打仗,皇帝就是用户,把将

将指定SQL的执行计划从共享池删除的方法

如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现. 对于以前的版本而言,最显而易见的方法莫过于直接刷新共享池,但是如果是数据库中绝大部分的SQL都存在问题,那么这种方法无可厚非,也可能是见效最快的方法,而如果数据库中仅仅是个别的SQL存在问题,那么这种方法就过于暴力了. SQL> select count(*) from dual; COUNT(*) ---

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

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

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

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

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表列意思: 引用:h

O-理解共享池

我们可以通过show sga命令查看共享池的整体组成部分: ....待截图.... 一.SGA内存结构 Oracle中SGA主要包括: 1.固定数据结构部分(FIXED Size) 2.数据块缓冲区(DATABASE BUFFER) 3.REDO LOG缓冲区(redo buffers) 4.共享池(在variable size中). 固定区域包含了所有其他共享内存结构和重要的数据结构的地址和指针.资源.锁等,可通过如下命令详细列出具体内容: select pool,name,bytes fro

Oracle OCP之硬解析在共享池中获取内存锁的过程

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38684819 1.获得library cache Latch (1)在父游标的名柄没有找到SQL语句的文本:select * from gyj_t1 where id=1; 2.释放library cache Latch 3.获得shared pool Latch     (1)搜索FreeList 空闲Chunk     (2)搜索LRU上可覆盖的chunk     (3)搜索R-Fr

体系结构中共享池研究

1.keep 让SQL跑得更快. 有时候一些基础表需要非常的频繁访问,尤其是在一些循环中,对该表中的访问速度将变的非常重要.为了提高系统的处理性能,可以考虑将一些表及索引读取并保存到内存中. 二.关于keep内存的几个参数 下面了解一下具体和CACHE有关的几个概念,即DB_CACHE中的几个pool: DB_CACHE_SIZE:指定缺省的buffer pool的大小,以字节为单位. DB_KEEP_CACHE_SIZE:指定keep buffer pool的大小,以字节为单位. DB_REC

java中字符串池,String池,共享池到底是怎么回事?

栈中有共享池的概念,(视频下载) (全部书籍)比如下面例子中,sz="hello";在栈中创建一个String对象引用变量sz,然后看看栈中有没有"hello",如果没有,则将"hello"存放进栈,并令sz指向"hello",如果已经有"hello" 则直接令sz指向"hello".对于int, float 类型的变量也是一样的有这种共享池的概念, 对于下面程序中:ss0 = new