oracle优化------缓存对象与数据(一)

2014-11-24 08:33:57 ? 作者: ? 浏览: 0

当系统出现性能瓶颈时,尽量较少不必要的资源消耗,最后就是平衡cpu,内存,io,network等资源,使数据库
可以稳定的运行。

oracle数据库优化的根本是


1.尽量减少资源消耗,例如优化sql,减少sql本身的资源消耗
2.如果无法进一步减少资源的消耗,那就让数据尽量靠近cpu,也就是把数据从硬盘转移到内存(内存的读写速度快)
或者换更快的磁盘

本文就简单总结下如何缓存数据和数据库对象(也就是把数据移向内存,提高内存的命中率,以提高整体io速度)

1.缓存数据
2.缓存数据对象的定义,例如package,procedure,pl/sql和sql(也就是cursor)等

上面说的这两种数据就存在oracle最重要的两个部件中share pool和buffer pool中,提高这两个pool的命中率也提高了
io速度,而io又是当今技术发展最慢,系统的最大的瓶颈。

1. 缓存数据


这里说的oracle数据是占大量存储空间的,不是存在数据库字典里的数据;oracle的数据的类型一般为:


SQL> select se.segment_type from dba_segments se group by se.segment_type;

SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO

11 rows selected

SQL>

在大部分时候,把这些数据放到内存里,会很大的提升系统的性能

buffer pool分为三个子pool,这三个pool都主要使用LRU算法管理的

default buffer pool:默认所有的数据块都存在这,并遵循本pool的LRU算法


keep buffer pool:如果指定数据块缓存到keep区的,数据块就不太可能因为执行其他一些操作被其他数据块交换出,即使较长时间没使用了,只遵循本pool的LRU


recycle buffer pool:设置recycle是因为有时会有一些大的又教少使用的表的操作,如果不设置单独的缓存区,那么缺省的缓存区中的数据块就被这些偶尔使用的数据换出,它的空间比较小,所以说一般使用完就释放掉了,它也只遵守本pool的LRU算法


以table为例:


修改table的缓存空间

alter table a_user storage(buffer_pool keep) cache/nocache; ---把表a_user缓存到keep buffer pool中最热端/把表a_user从keep buffer pool立刻释放出去

alter table a_user cache/nocache ---把表a_user缓存到default buffer pool中最热端/把表a_user从default buffer pool立刻释放出去

eg:


1)

SQL> alter table a_user storage(buffer_pool keep) cache;

Table altered

2)

SQL> select t.table_name,t.cache,t.buffer_pool from user_tables t where t.table_name=upper(a_user);

TABLE_NAME CACHE BUFFER_POOL
------------------------------ -------------------- -----------
a_user Y KEEP

说明:


user_tables.cache:这个表一旦被读入buffer cache,就会放在链表的热端~ 尽量不被挤出buffer cache
user_tables.buffer_pool:把这个表放入特殊的buffer cache中,这些特殊的buffer cache是独立的

而视图v$db_object_cache.kept:告知是否对象常驻shared pool(yes/no),有赖于这个对象是否已经利用PL/SQL 过程

DBMS_SHARED_POOL.KEEP“保持”(永久固定在内存中)

eg:


SQL> Select oc.NAME,oc.TYPE,oc.KEPT from v$db_object_cache oc where oc.TYPE=TABLE AND OC.OWNER=HPO;

NAME TYPE KEPT
-------------------------------------------------------------------------------- ---------------------------- ----
A_USER TABLE YES

这个v$db_object_cache视图提供对象在library cache(shared pool)中对象统计,提供比v$librarycache更多的细节,并且常用于找出shared pool中的活动对象。


所以你没有使用过对象时,是不存在这个视图里的,使用时用了,才会在这个视图里出现

可以参看三思的动态性能视图介绍: http://space.itpub.net/7607759/viewspace-22241


例如修改索引的buffer pool


alter index IDX_ORG_TYPE storage(buffer_pool keep) cache;

分区表和分区索引好像不能把每个分区放在不同的buffer pool中,反正我测试通过

2.缓存数据对象的定义,例如package,procedure,pl/sql和sql(也就是cursor)等

上面介绍了把数据尽量缓存在buffer pool中,提高数据在内存的命中率,避免从磁盘读写数据,间接提高系统io能力;
buffer pool缓存的数据是用户最终的目标数据,而把这些用户最终目标数据要传达给用户,就需要oracle用另外一些
动作来完成,而这些动作主要是在share pool中完成的,大概功能有:缓存语句文本,分析代码,执行计划,数据字典
中的表和列的权限定义等;share pool主要也用LRU算法,所以怎样尽量缓存这些数据就是下面要说的

oracle分为sql引擎和pl/sql引擎,分别完成sql和pl/sql的解析等工作,而这里解析又是很耗资源的,所以就要想办法
尽量少解析,使代码重用以提高效率

A。代码的重用

确定是否需要对语句进行(硬)解析时,是先比较语句的哈希值,下面的两种方法有助于获得相同的哈希值,从而可以实现重用代

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: