分区表放入keep pool,recycle pool的问题及解析

因为生产环境的性能瓶颈,经过诊断,给出的结论是需要把几个表和索引放入keep pool,几个索引放入recycle pool.
其实放入keep pool 确实对于频繁访问的数据,而且数据量不大的情况下,性能有一定的改善。避免了大量的物理读。大家的大体感觉都是把表放入keep pool,其实在一定的情况下,把索引放入keep pool也有一定的道理,某些较大的索引,可能已经走了索引但是还是因为索引占用的数据块较多,段太大,还是会走大量的物理读,放入keep pool也有一定的改善。
至于recycle pool的使用,对于数据量很大的表来说,如果数据访问不是很频繁但是因为性能考虑,还是需要做些什么的时候,可以考虑把表或者索引放入recycle pool,让它尽管去不停的刷那一部分缓存,不会带来太多的性能抖动。

闲话少说,放入keep pool,recycle pool,可以使用两个ddl语句就能简单完成。
alter table xxxx storage(buffer_pool keep);
alter table xxx storage(buffer_pool recycle);
对于索引也是类似,如果要取消,只需要制定为默认的pool就可以了
alter index xxxx storage(buffer_pool default).
都是修改storage属性。

当然了,这些操作都要确保db_recycle_cache_size,db_keep_cache_size都得指定一定空间。
这次操作的是几个分区表和分区索引,很快就执行了语句,然后自己验证的时候突然发现,有的没起作用。很是奇怪。

先来看看模拟的数据,两个表,一个是分区表,一个是普通heap表。它们默认都在default pool中。
SQL> select table_name,buffer_pool from user_tables;
TABLE_NAME                     BUFFER_POOL
------------------------------ ---------------------
TEST                               DEFAULT
PARTITION_TEST                 DEFAULT

把普通表和分区表都放入keep pool中。
SQL> alter table test storage(buffer_pool keep);
Table altered.

SQL> alter table partition_test storage(buffer_pool keep);
Table altered.

查看它们的存储情况。发现一个在keep pool,一个却还在default pool.
SQL> select table_name,buffer_pool from user_tables;
TABLE_NAME                     BUFFER_POOL
------------------------------ ---------------------
TEST                                   KEEP
PARTITION_TEST                 DEFAULT

想是不是放入keep pool还需要一定的时间,然后又执行了一遍。
SQL> alter table partition_test storage(buffer_pool keep);
Table altered.

然后再次查看结果还是一样。
SQL>  select table_name,buffer_pool from user_tables;

TABLE_NAME                     BUFFER_POOL
------------------------------ ---------------------
TEST                                  KEEP
PARTITION_TEST                 DEFAULT

翻看metalink,对于分区表的keep pool,确实有一些bug,但是bug已经在11.2.0.2.0版本已经修复了,我这个环境都是11.2.0.3.0的环境了。
其中一个bug(1704527),ID 17040527.8),给出的workaround是刷新shared_pool,然后再次尝试。
SQL> alter system flush shared_pool;
System altered.

SQL> select table_name,buffer_pool from user_tables;
TABLE_NAME                     BUFFER_POOL
------------------------------ ---------------------
TEST                                   KEEP
PARTITION_TEST                 DEFAULT

最后发现,需要在分区表的视图中查看才能看到。
SQL> select table_name,buffer_pool from user_tab_partitions where table_name='PARTITION_TEST';
TABLE_NAME                     BUFFER_POOL
------------------------------ ---------------------
PARTITION_TEST                 KEEP

最后重新放回default pool
SQL> ALTER TABLE PARTITION_TEST STORAGE(BUFFER_POOL DEFAULT);
Table altered.

可以看到又回到了default池。
SQL>  select table_name,buffer_pool from user_tab_partitions where table_name='PARTITION_TEST';
TABLE_NAME                     BUFFER_POOL
------------------------------ ---------------------
PARTITION_TEST                 DEFAULT
最后问题会到原点,为什么分区表的buffer_pool显示就这么特别呢。
用一个例子来说明。分区表中有很多分区,可以在创建分区表的时候就指定哪些分区放到keep pool哪些放到default pool.
我把一个分区表中的两个分区放到了keep pool,剩下的都放到了default pool.如下所示。

TABLE_NAME                     PARTITION_NAME                                                                          BUFFER_POOL
------------------------------ ------------------------------------------------------------------------------------------ ---------------------
PARTITION_TEST2              PMAXVALUE                                                                                  DEFAULT
PARTITION_TEST2              PR001_P1                                                                                   KEEP
PARTITION_TEST2              PR002_P2                                                                                   DEFAULT
PARTITION_TEST2              PR003_P3                                                                                   KEEP
PARTITION_TEST2              PR004_P4                                                                                   DEFAULT
PARTITION_TEST2              PR005_P5                                                                                   DEFAULT
PARTITION_TEST2              PR006_P6                                                                                   DEFAULT
PARTITION_TEST2              PR007_P7                                                                                   DEFAULT
PARTITION_TEST2              PR008_P8                                                                                   DEFAULT
PARTITION_TEST2              PR009_P9                                                                                   DEFAULT
PARTITION_TEST2              PR010_P10                                                                                  DEFAULT
11 rows selected.

面对这种情况,在user_tables中是显示default好呢,还是keep好呢我觉得还是default好。想看具体的细节还是得到分区数据字典里。
SQL> select buffer_pool,table_name from user_tables where table_name='PARTITION_TEST2';

BUFFER_POOL           TABLE_NAME
--------------------- ------------------------------
DEFAULT               PARTITION_TEST2

如果在创建分区表之后想对某些分区指定存储特性,可以使用如下的语句。
SQL> alter table PARTITION_TEST2 modify partition "PR009_P9" storage(buffer_pool keep);
Table altered.

时间: 2024-09-16 06:22:52

分区表放入keep pool,recycle pool的问题及解析的相关文章

关于纠结的recycle pool的设置

现在生产环境中目前有一个很大的中继表,作为多个流程的数据流动所用,数据量很大.里面有clob字段,加上庞大的数据量,表就显得很臃肿了. 目前在做大批量的数据处理的时候发现了一些问题,事物数在不断增加的情况下,数据的处理速度也在不断的降低.最后出现了一些资源的问题. 在抓取了awr和同事的分析之后,产品部门建议把对应的clob放入recycle pool里面.一方面能够降低buffer cache的负载.让clob的部分尽快的从缓存中不断的刷新. 对于recycle pool的设置没有问题,可以设

Python利用多进程将大量数据放入有限内存的教程_python

简介 这是一篇有关如何将大量的数据放入有限的内存中的简略教程. 与客户工作时,有时会发现他们的数据库实际上只是一个csv或Excel文件仓库,你只能将就着用,经常需要在不更新他们的数据仓库的情况下完成工作.大部分情况下,如果将这些文件存储在一个简单的数据库框架中或许更好,但时间可能不允许.这种方法对时间.机器硬件和所处环境都有要求. 下面介绍一个很好的例子:假设有一堆表格(没有使用Neo4j.MongoDB或其他类型的数据库,仅仅使用csvs.tsvs等格式存储的表格),如果将所有表格组合在一起

pb代码解答-PB 如何截取字符串分别放入数组中

问题描述 PB 如何截取字符串分别放入数组中 "三厂,二厂,一厂" 我的里面有三个内容我想要取成 软件分厂 二厂 一厂 将这三个值放进数组 求大神解答 解决方案 string str =substring(字符串,开始位置,截取长度); 解决方案二: 采用以下函数 global type gf_split_parm from function_object end type forward prototypes global function integer gf_split_parm

php基础教程:文件以二进制形式上传并放入数据库

  php基础教程:文件以二进制形式上传并放入数据库 conn.php: <?php $id=mysql_connect('localhost','root','root'); mysql_select_db("db_database12",$id); mysql_query("set names gb2312"); ?> index.php: <html> <head> <meta http-equiv="Con

把Session放入MySql

mysql|session session通常放在/tmp目录下,而该文件夹的权限是everbody可读,这个就非常可怕了!学校的论坛曾经就有人通过session来盗取帐号!所以后来就尝试把session放入数据库,表的结构和过程如下://创建表//create sesslib.sqlCREATE TABLE sesslib (   data text,   time datetime,   id int(11) DEFAULT '0' NOT NULL auto_increment,   si

用函数读出数据表内容放入二维数组

//用函数读出数据表内容放入二维数组 //动态sql语句 //以读出点击次数表为例. function list_hit($fields,$where,$order,$direction,$limit,$conn) { if ($fields=="") {$fields="hit_id,banner_id,hit_ip,hit_time";} if ($order=="") {$direction="";} $sql=&quo

选择立即购买好还是放入购物车好?

现在淘宝.拍拍以及百度有啊都有立即购买和放入购物车的操作按钮.不过,易趣在商品详情页面只有立即购买的操作按钮.手头上没有数据,所以很难说得清楚到底有放入购物车好还是没有放入购物车好. 在现实生活中,购物车是为了方便携带一次性购买过多的商品而设计的.毕竟双手所携带的东西是非常有限的,当你购买的商品多于你双手所能携带的商品的时侯,你就需要借助其它的工具来方便你携带以及进一步的购物.所以在这个时侯,购物车便出现了. 而网上购物车的作用究竟是什么?就我个人的认识来看,网上购物车有合并购买的方便.当你将多

不要把auto_ptr放入容器

本来没有打算自己翻译Effective STL的,怕影响大家情绪:),只是发现有些条款在网络上找不到,只好自己翻译了.--Winter 坦白的讲,这个条款不应加入本书,因为包含atuo_ptr的容器(COAPs)本来在STL中就是禁止的.就算你这么用了,编译器也不会编译你的代码.而标准委员会也没有解释为什么不能这样.对于COAPs我应该什么都不用说的,因为你的编译器应该替你做好了一切工作,所有这种类似的代码都不应该被编译. 可惜的是,许多程序员使用的STL版本并不拒绝COAPS,更要命的是,许多

php将session放入memcached的设置方法

 这篇文章主要介绍了php将session放入memcached的设置方法,需要的朋友可以参考下 可以修改php.ini文件的情况下:   1.修改php.ini中的    代码如下: session.save_hander = memcache; session.save_path = "tcp://host:端口号";//例如:session.save_path = "tcp://127.0.0.1:11211";     2.正常存取session的值就OK了