+++++buffer cache 深度解析(12)


这里要说明的是,从名字上看,很容易让人误以为这三种 cache提供了三种不同的管理内存数据块的机制 。但事实上,它们之间在管理和内部机制上没有任何的区别 。它们仅仅是为DBA们提供了一个选择,就是能够将数据库对象分成“非常热的”、“比较热的”和“不热的”这三种类型 。因为数据库中总会存在一些“非常热”的对象,它们频繁的被访问 。而如果某个时候系统偶尔做了一次大表的全表扫描,就有可能将这些对象清除出内存 。为了防止这种情况的发生,我们可以设置keep类型的 cache,并将这种对象都移入keepcache中 。同样的,数据库中也总会有一些很大的表,可能每天为了生成一张报表,而只需要访问一次就可以了 。但有可能就是这么一次访问,就将大部分的内存数据块清除出了 cache 。为了避免这种情况的发生,可以设置类型的 cache,并将这种偶尔访问的大表移入cache 。
毫无疑问,如果你要设置这三种类型的 cache,你需要自己研究并等于你的数据库中的对象进行分类,并计算这些对象的大小,从而才能够正确的把它们放入不同的 cache 。但是,不管怎么说,设置这三种类型的 cache只能算是最低层次的优化,也就是说在你没有任何办法的情况下,可以考虑设置他们 。但是如果你能够优化某条 gets非常高SQL使其 gets降低50%的话,就已经比设置多个 cache要好很多了 。
9i以后还提供了可以设置多种数据块尺寸(2、4、8、16 或 32k)的 cache,以便存放不同数据块尺寸的表空间中的对象 。使用初始化参数:来指定不同数据块尺寸的 cache,这里的N就是2、4、8、16 或 32 。创建数据库时,使用初始化参数:所指定缺省的数据块尺寸用于表空间 。然后可以指定最多4个不同数据块尺寸的表空间,每种数据块尺寸的表空间必须对应一种不同尺寸的 cache,否则不能创建不同数据块尺寸的表空间 。
SQL> create tablespace tbs_test_16k2datafile 'C:\oracle\oradata\ora92\tbs_test_16k.dbf' size 10M3blocksize 16k;create tablespace tbs_test_16k*ERROR 位于第 1 行:ORA-29339: 表空间块大小 16384 与配置的块大小不匹配SQL> show parameter db_16k_cache_sizeNAMETYPEVALUE------------------------------------ ----------- ------------------------------db_16k_cache_sizebig integer 0
我们可以看到,由于16k数据块所对应的 cache没有指定,所以创建16k数据块的表空间会失
败 。于是我们先设置,然后再试着创建16k数据块的表空间 。
SQL> alter system set db_16k_cache_size=10M;系统已更改 。SQL> create tablespace tbs_test_16k2datafile 'C:\oracle\oradata\ora92\tbs_test_16k.dbf' size 10M3blocksize 16k;表空间已创建 。
不同尺寸数据块的 cache的管理和内部机制与缺省数据块的 cache没有任何的分别 。它最大的好处是,当使用可传输的表空间从其他数据库中将不同于当前缺省数据块尺寸的表空间传输过来的时候,可以不做很多处理的直接导入到当前数据库,只需要设置对应的数据块尺寸的 cache即可 。同时,它对于调优OLTP和OLAP混合的数据库也有一定的用处 。OLTP环境下,倾向于使用较小的数据块,而OLAP环境下,由于基本都是执行全表扫描,因此倾向于使用较大的数据块 。这时,可以将OLAP的表转移到使用大数据块(比如32k)的表空间里去 。而将OLTP的表放在中等大小的数据块(比如8k)的表空间里 。
对于应该设置 cache为多大,从9i开始通过设置初始化参数:,从而提供了可以参照的建议值 。会监控类型、keep类型和类型的 cache的使用,以及其他五种不同数据库尺寸(2、4、8、16 或 32k)的 cache的使用 。在典型负荷的时候,启用该参数,从而收集数据帮助用户确定最佳的的大小 。该参数有三个值: