体系结构中共享池研究

1.keep 让SQL跑得更快。

有时候一些基础表需要非常的频繁访问,尤其是在一些循环中,对该表中的访问速度将变的非常重要。为了提高系统的处理性能,可以考虑将一些表及索引读取并保存到内存中。

二、关于keep内存的几个参数

下面了解一下具体和CACHE有关的几个概念,即DB_CACHE中的几个pool:

DB_CACHE_SIZE:指定缺省的buffer pool的大小,以字节为单位。

DB_KEEP_CACHE_SIZE:指定keep buffer pool的大小,以字节为单位。

DB_RECYCLE_CACHE_SIZE:指定recycle buffer pool的大小,以字节为单位。

Keep Buffer Pool

其作用是缓存那些需要经常查询的对象但又容易被默认缓冲区置换出去的对象,按惯例,Keep pool设置为合理的大小,以使其中存储的对象不再age out,也就是查询这个对象的操作不会引起磁盘IO操作,可以极大地提高查询性能。

默认的情况下db_keep_cache_size=0,未启用,如果想要启用,需要手工设置db_keep_cache_size的值,设置了这个值之后db_cache_size会减少。

并不是我们设置了keep pool之后,热点表就一定能够缓存在keep pool,keep pool同样也是由LRU链表管理的,当keep pool不够的时候,最先缓存到keep pool的对象会被挤出,不过与default pool中的LRU的管理方式不同,在keep pool中表永远是从MRU移动到LRU,不会由于你做了FTS而将表缓存到LRU端,在keep pool中对象永远是先进先出。

Recycle Buffer Pool

Recycle Buffer Pool正好相反。Recycle Buffer Pool用于存储临时使用的、不被经常使用的较大的对象,这些对象放置在Default Buffer Pool显然是不合适的,这些块会导致过量的缓冲区刷新输出,而且不会带来任何好处,因为等你想要再用这个块时,它可已经老化退出了缓存。要把这些段与默认池和保持池中的段分开,这样就不会导致默认池和保持池中的块老化而退出缓存。

--前提:必须保证db_keep_cache_size值不为0,所以首先有如下操作:
--此处只是做试验,所以暂缺设置100M这么大。
alter system set db_keep_cache_size=100M;
drop table t;
create table t as select * from dba_objects;
create index idx_object_id on t(object_id);

--未执行KEEP命令,通过如下查询出BUFFER_POOL列值为DEFAULT,表示未KEEP。

select BUFFER_POOL from user_tables where  TABLE_NAME=‘T‘;
select BUFFER_POOL from user_indexes where INDEX_NAME=‘IDX_OBJECT_ID‘;

alter index idx_object_id storage(buffer_pool keep);
--以下将索引全部读进内存
select /*+index(t,idx_object_id)*/ count(*) from t where object_id is not null; 
--以下将数据全部读进内存
alter table t storage(buffer_pool keep);
select /*+full(t)*/ count(*) from  t;

--执行KEEP操作后,通过如下查询出BUFFER_POOL列值为KEEP,表示已经KEEP成功了

select BUFFER_POOL from user_tables where  TABLE_NAME=‘T‘;
select BUFFER_POOL from user_indexes where INDEX_NAME=‘IDX_OBJECT_ID‘;

--疑问,请问是否只有执行下面命令才是真正缓存到keep内存呢? 

--查询到放在keep区中的表,但是不意味着表已经被缓存. 

--将表T缓存

SQL> alter table t cache; 

体系结构中共享池研究

时间: 2024-12-09 15:39:40

体系结构中共享池研究的相关文章

为什么branch prediction和cache是硬件体系结构中两大研究主题?

摘要: 本文主要通过简单的量化计算的例子,来说明为什么硬件体系结构研究中branch prediction和cache是两大 研究的主题. 基本概念介绍: 描述案例之前,我们简单的介绍几个概念: 1. CPI:cycle-per-instruction,即每条指令需要的时钟周期数,对于理想的处理器,我们认为一条指令就需要一个 时钟周期,也即CPI=1.0; 2. IPC:instruction-per-cycle,即每个时钟可以执行多少条指令,即CPI的倒数: 3. 假设理想的CPI=1.0,但

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

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

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

硬件体系结构中的缓存的定性与定量分析案例

摘要: 本文主要就硬件体系结构中,cache对处理器性能的影响给出定量统计的例子,并且由定量的结果如何推导出定性的结论. 问题描述: 假设某顺序执行的处理器,其平均缺失率为2%,平均每条指令要访问存储器1.5次,cache缺失代价为100个周期: 此处将cache命中时间包含在cpu执行时间内,cpu理想的cpi为1.0.比较cache的存在与否,对于性能的影响. 问题解答: 这里的性能评估从cpu时间入手: 那么我们将对应的数据代入后: 就可以得到在存在cache的情况下的cpu时间: 那么接

共享池之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的执行计划从共享池删除的方法

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

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

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