如何将oracle 对象pin在共享池中

dbms_shared_pool.keep 可以将对象pin入shared_pool,而不进入LRU 机制被keep的对象可以是数据库对象,也可以是sql
dbms_shared_pool.unkeep为反操作。
实验如下:(实验环境 11.2.0.1
执行一个sql,并查看其在shared_pool 中的address和hash_value值。
yang@rac1>select count(*) from yang_a;
  COUNT(*)
----------
        29
yang@rac1> select address,hash_value,sql_text from v$sqlarea where sql_text like 'select count(*) from yang_a%';
ADDRESS          HASH_VALUE  SQL_TEXT
---------------- ----------- ------------
00000001736C9E48 1083615814  select count(*) from yang_a

yang@rac1>select address,hash_value,executions,parse_calls from v$sql where sql_text like 'select count(*) from yang_a%';
ADDRESS          HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736C9E48 1083615814          1           1
keep该sql语句的执行计划到shared_pool。
yang@rac1>exec sys.dbms_shared_pool.keep('00000001736C9E48,1083615814','C');
PL/SQL procedure successfully completed.
在v$db_object_cache 中查询kept字段为yes ,说明该对象已经被保存!
yang@rac1>select owner,name,kept from v$db_object_cache where hash_value='1083615814';
OWNER      NAME                                     KEP
---------- ---------------------------------------- ---
           select count(*) from yang_a              YES
           select count(*) from yang_a              YES

yang@rac1>SELECT COUNT(*) FROM v$sql WHERE hash_value='1083615814';
  COUNT(*)
----------
         1
因为已经被保存了,所以执行删除hash_value值为1083615814 时候报错,
yang@rac1>exec SYS.dbms_shared_pool.purge('00000001736C9E48,1083615814','C');
BEGIN SYS.dbms_shared_pool.purge('00000001736C9E48,1083615814','C'); END;

*
ERROR at line 1:
ORA-06596: object cannot be  purged, object is permanently kept in shared pool
ORA-06512: at "SYS.DBMS_SHARED_POOL", line 31
ORA-06512: at "SYS.DBMS_SHARED_POOL", line 77
ORA-06512: at line 1

对hash_value值为1083615814 执行计划进行unkeep
yang@rac1>exec sys.dbms_shared_pool.unkeep('00000001736C9E48,1083615814','C');
PL/SQL procedure successfully completed.
再次删除
yang@rac1>exec SYS.dbms_shared_pool.purge('00000001736C9E48,1083615814','C');
PL/SQL procedure successfully completed.
yang@rac1>SELECT COUNT(*) FROM v$sql WHERE hash_value='1083615814';
  COUNT(*)
----------
         0
yang@rac1>select address,hash_value,executions,parse_calls from v$sql where sql_text like 'select count(*) from yang_a%';
no rows selected
yang@rac1>SELECT address,hash_value,sql_id FROM v$sql_plan WHERE hash_value='1083615814';
no rows selected

演示 keep对于队列的作用。
创建队列,默认为队列在内存中的cache 为20.
yang@rac1>create sequence seq_yang;
Sequence created.
yang@rac1>select seq_yang.nextval from dual;

   NEXTVAL
----------
         1
清除cache在内存中的队列的值。
yang@rac1>alter system flush shared_pool;
System altered.

yang@rac1>select seq_yang.nextval from dual;
   NEXTVAL
----------
        21
nextval为21 表示,随着flush 共享池,sequence的cache被清空了。
将队列keep在缓存中,
yang@rac1>exec sys.dbms_shared_pool.keep('seq_yang','q');
PL/SQL procedure successfully completed.

yang@rac1>select seq_yang.nextval from dual;
   NEXTVAL
----------
        22
然后再次flush 共享池。
yang@rac1>alter system flush shared_pool;
System altered.
查看nextval的值,结果:
yang@rac1>select seq_yang.nextval from dual;
   NEXTVAL
----------
        23
说明keep起作用了!被keep在共享池中的对象不会被flush 操作清除。
yang@rac1>exec sys.dbms_shared_pool.unkeep('seq_yang','q');
PL/SQL procedure successfully completed.
yang@rac1>select seq_yang.nextval from dual;
   NEXTVAL
----------
        24
yang@rac1>alter system flush shared_pool;
System altered.
yang@rac1>select seq_yang.nextval from dual;
   NEXTVAL
----------
        41
相信到这里,我们可以对dbms_shared_pool.keep /unkeep 的作用有了初步的了解。^ _ ^

时间: 2024-10-03 21:12:07

如何将oracle 对象pin在共享池中的相关文章

使用DBMS_SHARED_POOL包将对象固定到共享池

--****************************************** -- 使用DBMS_SHARED_POOL包将对象固定到共享池 --******************************************         DBMS_SHARED_POOL包提供存储过程来将PL/SQL对象或SQL游标固定到Oracle 共享池.一旦这些对象固定之后,将不再参与aged out,而 是常驻内存,即便是使用alter system flush shared_poo

共享池中保留池的调整(shared_pool_reserved_size)

--************************************************* -- 共享池中保留池的调整(shared_pool_reserved_size) --*************************************************   1.何谓保留池         简言之,保留一部分内存空间以备不时之需.通常情况下,Oracle会将大的内存请求分割成小的内存块来满足需求.而对于大的内     存且为连续的内存空间请求,如果在共享池中未找

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

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

共享池的调整与优化(Shared pool Tuning)

--======================================= -- 共享池的调整与优化(Shared pool Tuning) --=======================================       共享池(Shared pool)是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成.其中库缓存的作用是存 放频繁使用的sql,pl/sql代码以及执行计划.数据字段缓存用于缓存数据字典.在内存空间有限的容量下

ORACLE--预编译与共享池--SGA基本介绍

我们暂时先不说其他的,我们先做一个简单的实验来证明来看出一些问题,最后通过为什么来说明实验的结论,并介绍原理和常规查看方式,好了,我们先看看下面三段代码分别执行的结果. 首先为了测试,我们需要创建一张表: CREATE TABLE PRE_TEST_TABLE(   C1  NUMBER,   C2  VARCHAR2(100)); 好了,我们做一个插入操作的对比: 代码段1: BEGIN       FOR I IN 1..20000 LOOP            EXECUTE IMMED

20150213关于共享池4-SQL内存结构父子游标

[20150213]关于共享池4x-SQL内存结构父子游标.txt --这个主要和recr和freeabl类似. --1.节约内存 --2.减少检索链表的时间. --3.oracle的算法规定,sql语句必须至少是一父一子的情况.很多情况下都是一父多子.也就是说,每个游标,oracle都会为它设置个父游标 --  如果有sql文本相同,但无法共享执行计划的情况出现,那就会出现一父多子的情况. --注意除了sql对象,共享池中其它类型的对象都没有父子游标的概念. --自己按照的介绍,重复测试一遍,

20151223关于共享池4x-SQL内存结构父子游标

[20151223]关于共享池4x-SQL内存结构父子游标.txt --重复测试:http://blog.itpub.net/267265/viewspace-1436541/ --这个主要和recr和freeabl类似. --1.节约内存 --2.减少检索链表的时间. --3.oracle的算法规定,sql语句必须至少是一父一子的情况.很多情况下都是一父多子.也就是说,每个游标,oracle都会为它设置个父游标 --  如果有sql文本相同,但无法共享执行计划的情况出现,那就会出现一父多子的情

[20160118]共享池的LRU链表.txt

[20160118]共享池的LRU链表.txt 共享池中的LRU和buffer cahce中的LRU算法有很大不同.共享池LRU链从总体上分两条:瞬时LRU,周期LRU.一个Chunk第1次被操作后, 会被放入瞬时LRU:如果又1次被用到了,将被移至周期LRU. 这两条LRU链有点像BUffer cache中的冷链和热链.瞬时LRU是冷链,周期LRU是热链.瞬时LRU中保存只被使用一次的chunk,周期LRU中保 存使用次数为2次及2次以上的Chunk. --以上内容摘自vage的<oracle

共享池2

硬解析:执行SQL时,SQL已经不再共享池中,会产生硬解析.首先分配共享池空间,创建父游标,创建子游标 软软解析:父游标存在,子游标也存在 软解析:父游标存在,子游标不可共享 游标共享技术ACS 游标不会马上关闭,会先放在游标缓存中,等待回话完成后,在关闭 OPEN_CURSORS会话打开的游标数量 SESSION_CACHED_CURSORS回话缓冲,主要功能:将会话中的常用的SQL放入UGA中的会话缓冲区中,以便下次调用 CURSOR_SPACE_FOR_TIME 当父游标被打开的时候,所有