日期:2014-05-17  浏览次数:21381 次

求助:删除大量数据后,如何回收表空间!
我们的DB中有一张表非常大,记录数在2800W左右,我按年份备份了一下,删除了1400万条数据,只保留了2年的数据。
但表空间使用率并未下降。

运行以下命令:alter tablespace endat01 coalesce;
很快就完了,但表空间使用率未变化。

我记得可以用命令释放删除数据后的表空间,但报错如下:
1,修改表,启动行移动的功能
alter table 表名 enable row movement;
(提示:ORA-14066: 非法的非分区表选项)
2,修改表,收缩表空间
alter table 表名 shrink space;
(提示:ORA-01735: 非法的 ALTER TABLE 选项)
怀疑是因为oracle版本太低,不支持!

请各位帮忙看看有什么办法。


此外,我们的数据库最近变得很慢,不知道是什么原因。
初步查了一下服务器CPU,内存占用率都比较低,应该不是服务器硬件的原因,应该是oracle的原因。
但实在不知道怎么查,不知道怎么优化?

各位大侠能否给个思路!

附:---------------------------------------------
介绍一下我们的数据库配置:
服务器:3.16G双核,4G内存,584G硬盘(Rid5,有硬Rid卡)
数据库:oracle8.16
日常会话:230个左右
数据文件:195
数据文件大小:50G左右
表空间:34(索引和数据分开建的表空间,但在同一个驱动器上)
最大占用率:79%(不算回滚表空间,回滚表空间只有3个,各256M,有一个占用率为83%)
shared_pool_size=50M
db_writer_processes=1
---------------------------------------------

------解决方案--------------------
先把表数据备份到另外一张表中,然后执行truncate table table_name
然后再把备份的导入到这个表中,然后删除备份表,试试
alter table 表名 shrink space; 
好像是在10g上才支持的
------解决方案--------------------
oracle8.16 不支持非分区表的row movement,所以连带的不能够使用shrink space

方法1: exp导出再导入
方法2: move tablespace,需要重建索引
alter table tab_name move tablespace xxx;
------解决方案--------------------
学习中,不过我觉得删除这么多的数据,所以即使不重建,也需要分析了,
然后,删除这么多用DELETE会用很长时间吧,
综合看来,还不如导出需要的数据到备份表,TRUNCATE,然后导入,重建索引来的划算呢,呵呵,学习哦


------解决方案--------------------
探讨
引用:
是什么版本的Oracle,如果是8i,用bstat和estat来进行分析,如果是9i用stackpack来分析,可以生成报告来判断数据库的资源使用及占用资源最大的sql及等待事件情况.


bstat,estat是什么啊
8i不能用Stackpack分析么,我刚找了关于这个的资料。

------解决方案--------------------
我也遇到过楼主类似的问题。
当时是采用3楼的方法解决的。
我觉得楼主的数据库设计应该更改一下:
假设那个大表叫TA,目前用户为UA,你应该在其他用户UB中建立一个同TA一样的表,存储在不同的表空间中.
并在每天夜维或每隔一段时间,自动把UA.TA部分内容导入到UB.TA中,这样,UA.TA永远不会太大。

------解决方案--------------------
需要注意的是:即使表空间回缩,数据文件德武里村也不会降低。
可以通过resize的方法回收物理空间。