分区表放入keep pool,recycle pool的问题及解析(34天)

因为生产环境的性能瓶颈,经过诊断,给出的结论是需要把几个表和索引放入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.

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

巧妙使用exchange partition的一个案例(r6笔记第1天)

前几天写过一篇文章讨论过分区表的在线重定义,其实就是另外一个分区表和现有的分区表做数据字典信息的交换 http://blog.itpub.net/2371875...

2574
来自专栏杨建荣的学习笔记

使用ash分析ORA-01652问题(r4笔记第36天)

今天在检查生产库的问题的时候,收到开发的邮件,他们在运行一个job的时候报出了ora的错误,想让我们来看一下是什么原因。 ora错误是01652的错误,单纯来看...

2475
来自专栏杨建荣的学习笔记

关于consistent gets(r5笔记第12天)

在sql调优的时候,一个关键指标就是consistent gets,如果这个指标很低,一般认为sql语句执行还是很高效的,反之效率会很低。但是这个指标我们知之甚...

3205
来自专栏乐沙弥的世界

Oracle 实例恢复

Oracle实例失败多为实例非一致性关闭所致,通常称为崩溃(crash)。实例失败的结果等同于shutdown abort。

785
来自专栏杨建荣的学习笔记

关于interval partitioning(r3笔记65天)

今天一个开发的同事问我一个问题,说在系统中目前需要一个临时的解决方案,定义了一张表,目前想设定为分区表,因为会和外围系统交互产生大量的数据,所以需要按照小时来做...

2548
来自专栏杨建荣的学习笔记

两个死锁的实例 (r5笔记第90天)

关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都是一致的。 The f...

3006
来自专栏杨建荣的学习笔记

关于收缩数据文件的尝试(r5笔记第34天)

在数据库中对于数据文件都是提前规划,不够就加的情况,很少会留意到其实有些数据文件那么大,其实条件允许也是可以收缩收缩的。 这种情况在本地测试环境中尤为突出,本来...

3346
来自专栏社区的朋友们

MySQL Online DDL

历史上看,MySQL 在 2007 年就完成了在线索引接口的设计。而 MySQL NDB Cluster、TokuDB 都早在 5.1 版本中就支持在线索引添加...

6730
来自专栏乐沙弥的世界

基于同一主机配置Oracle 11g Data Guard(logical standby)

      Oracle Data Guard逻辑备库是利用主库的一个备份首先建立一个物理备库,然后再将其转换为逻辑备库。这之后主库将日志传递到备库,备库利用l...

511
来自专栏逸鹏说道

维护索引(3)——通过重建索引提高性能

前言: 重建一个索引只是在内部删除并重建索引,使得碎片消失、统计信息更新、物理顺序重新排列组织。它会压缩数据页,按照填充因子填充适当的数据。如果有需要,也会添加...

2334

扫描关注云+社区