专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Oracle管理

请问表空间优化的有关问题

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
请教表空间优化的问题
如果用delete 或droptable删除表所有数据,会造成表已经分配的存储空间不能自动回收。
那有什么办法能够检查数据库中有多少诸如此此类的垃圾空间,分别对应那些表,有没有什么简便的回收办法?
------解决思路----------------------
1. drop 的表, 可以 purge recyblebin ,把回收站清下; 
2. delete 的表,如果表里的数据不多 的话,可以MOVE  下,MOVE 完成后,rebuild 一下IX 和PK;
3. 终极方法,exp/imp 一下,简单粗暴,测试环境中比较好的选择;

------解决思路----------------------
引用:
Quote: 引用:

1. drop 的表, 可以 purge recyblebin ,把回收站清下; 
2. delete 的表,如果表里的数据不多 的话,可以MOVE  下,MOVE 完成后,rebuild 一下IX 和PK;
3. 终极方法,exp/imp 一下,简单粗暴,测试环境中比较好的选择;


PURGE RECYCLEBIN测试了一下,清完后统计表空间容量(dba_data_files、dba_free_space),发现表空间剩余容量几乎没有变化,甚至还小了,已分配的块数和未分配块数没有变化。这是什么原因?

对生产环境,有没有类似方法3效果的处理办法?


purge recyclebin 后,如果没有变化,那就是回收站没有东西;

生产环境的话,就建一个别的表空间,就在业务不忙的时候 MOVE 到新表空间,看你的时间,每次可以移动一部分表和LOB(如果有),并移完表后 Rebuild IX ,等所的对象都过去了,把原表空间都干掉,再把新表空间改,10g 以上表空间名可以改名;
------解决思路----------------------
delete和drop table分别造的是表和表空间的高水位问题,delete留下的空间不会从表中释放,会留给以后该表的新增数据来使用。drop掉的表的空间会留给新的extent使用,但不会从数据文件中释放

高水位不释放是有道理的。
首先,表的高水位:表(段)是由盘区(extent)组成,而盘区是由一组连续的块(contiguous blocks)构成。当你delete数据的时候,它们大部分情况下会分配在不同的extent/block上,而block是逻辑存储结构的最小单位,在其中还有其他数据时是不可能简单回收的,除非打开行移动来收缩表,否则无法将这些空间从表中释放掉。
其次,表空间的高水位:当操作系统给表空间中的数据文件分配空间时,便被初始化成blocks。数据文件可以进行收缩,但仅限于未被使用的blocks。表删除以后,占用的blocks会被释放用于新的extent。但是,当连续的blocks不足以组成一个extent且不能被合并时,就形成了碎片。

不能简单将它们都列为垃圾空间。表中的有效空间利用率可以通过每条记录大致占用的字节数*记录数与表中分配空间来进行估计。至于表空间的碎片情况,可以通过fsfi指数来评估。关于fsfi可以搜索一下

空间整理:
表可以通过行移动来收缩,或是逻辑导出再倒入
表空间:数据逻辑导出以后,重新创建表空间,再进行导入
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: