oracle 学习小结4
1 buffer cache 中有两个队列,一个是free buffer list,当数据被修改后,状态
变为dirty,移动到dirty list,dirty list上的都是侯选的可以被DBWR写出
到数据文件的buffer
2 buffer cache会存在latch竞争
3 oracle还提供了buffer bucket结构,就象图书馆寻找图书的索引卡片,用于快速判断数据块是否在
buffer cache中,抽屉中的每张卡片就是一个buffer header,实际上是以链表的形式存在闩在一起(cache
buffer chain),这就会产生cache buffer chain竞争,而增加bucket一点,可以快速进行搜索,但也
不是增加得越多越就越好
4 从8I后,每个buffer latch需要管理多个bucket,每个bucket上的buffer数量降低,latch性能提升
5 查询当前数据库最繁忙的buffer
在x$bh中有个字段tch ,表明一个buffer的访问次数,越多越表明存在竞争:
SELECT *
FROM (SELECT addr, ts#, file#, dbarfil, dbablk, tch
FROM x$bh
ORDER BY tch DESC)
WHERE ROWNUM < 11;
再查询出这些热点buffer来自哪些对象:
SELECT e.owner, e.segment_name, e.segment_type
FROM dba_extents e,
(SELECT *
FROM (SELECT addr, ts#, file#, dbarfil, dbablk, tch
FROM x$bh
ORDER BY tch DESC)
WHERE ROWNUM < 11) b
WHERE e.relative_fno = b.dbarfil
AND e.block_id <= b.dbablk
AND e.block_id + e.blocks > b.dbablk;
找出热点对象的相关信息:
SELECT distinct e.owner, e.segment_name, e.segment_type
FROM dba_extents e,
(SELECT *
FROM (SELECT addr, ts#, file#, dbarfil, dbablk, tch
FROM x$bh
ORDER BY tch DESC)
WHERE ROWNUM < 11) b
WHERE e.relative_fno = b.dbarfil
AND e.block_id <= b.dbablk
AND e.block_id + e.blocks > b.dbablk;
6 SHARD POOL的基本原理:
通过shard pool实现SQL共享,减少代码硬解析等,从而提高数据库的性能。包括了库缓存(v$librarychace视图,
保存了SQL语句执行计划,执行的代码块等)
,数据字典缓存(v$rowcache)查询。
从11G开始多了一个result cache memory,主要是将查询的结果集缓存起来,如果同一SQL多次执行,就把结果直接返回。
服务端的result cache memory由两部分组成:sql query result cache,存储SQL查询的结果集
通过参数result_cache_max_size设置大小,如果=0,则禁止该特性。
设置有auto(自动),manual(通过查询hints判断),设置force(尽可能缓存)结果
比如
select /*+ result_cache */ ...............
查看cache 使用情况
select * from v$result_cache_memory where free='no';
查询result cache的统计信息
select * from v$result_cache_statisitcs;
7 oracle 9i中,增加了子缓冲池的管理,shared pool划分为多个子缓冲池,9I中每个子缓冲池至少为128MB,SUBPOOL
最多有7个;在10G中,每个子缓冲为256MB,每4个CPU分配一个子缓冲。11G中,每个至少为512MB
8 oracle中,如果SQL语句大小写不同,也会认为是不同的SQL,不会重用
9 ORA-04031错误:当尝试分配大块连续内存失败(碎片过多),先清除共享池中当前没用的所有对象,是空闲块合拼,如果
依然没足够内存满足需要,产生该错误
10 查询硬解析次数
1)select name,value from v$mystat a,v$statname b where a.statist