1. buffer cache的概念
数据高速缓存区(db buffer cache),通常就叫做buffer cache。按照oracle官方的说法,buffer cache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。通过初始化参数:buffer_cache_size来指定buffer cache的大小。oracle实例一旦启动,该区域大小就被分配好了。
用最简单的语言来描述oracle数据库的本质,其实就是能够用磁盘上的一堆文件来存储数据,并提供了各种各样的手段对这些数据进行管理。作为管理数据的最基本要求就是能够保存和读取磁盘上的文件中的数据。众所周知,读取磁盘的速度相对来说是非常慢的,而内存相对速度则要快的多。因此为了能够加快处理数据的速度,oracle必须将读取过的数据缓存在内存里。而oracle对这些缓存在内存里的数据起了个名字:数据高速缓存区(db buffer cache)
2.手动刷新Buffer Cache
在Oracle9i里,Oracle提供了一个内部事件,用以强制刷新Buffer Cache,其语法为:
alter session set events 'immediate trace name flush_cache level 1';
或者:
alter session set events = 'immediate trace name flush_cache';
类似的也可以使用alter system系统级设置:
alter system set events = 'immediate trace name flush_cache';
在Oracle10g,11g,Oracle提供一个新的特性,可以通过如下命令刷新Buffer Cache:
alter system flush buffer_cache;
我们通过试验来看一下刷新Cache的作用:
1.建立一个测试表
create table test_10 as select * from dba_objects
2.对这个表进行分析
analyze table test_10compute statistics;
3. select blocks,empty_blocks from dba_tables where table_name='TEST_10'
SQL> select blocks,empty_blocks from dba_tables where table_name='TEST_10';
BLOCKS EMPTY_BLOCKS
---------- ------------
1060 92
4.select count(*) from x$bh where state=0;
x$bh--buffer header 它记录了数据块头信息,=0 表示,释放的数据块;
5.手动刷新Buffer Cache
alter system set events = 'immediate trace name flush_cache';
6.select count(*) from x$bh where state=0;
通过4,6,两个结果,就可以看到结果了。