alter table 表名 move和alter table 表名 shrink space都可以用来进行段收缩,降低高水位HWM,
也都可以用来消除行链接(Row Chaining)和行迁移(Row Migration),估计效果不明显,看你的数据库用途是干什么的(如果是数据仓库肯定是不明显的).
解决方案
执行
alter?table?jk_test?move
或
alter?table?jk_test?deallocate?unused
alter?table?jk_test?shrink?space.
注意:因为alter table jk_test move 是通过消除行迁移,清除空间碎片,删除空闲空间,实现缩小所占的空间,但会导致此表上的索引无效(因为ROWID变了,无法找到),所以执行 move 就需要重建索引.
找到表对应的索引
select?index_name,table_name,tablespace_name,index_type,status?from?dba_indexes?where?table_owner='SCOTT'
根据status 的值,重建无效的就行了.sql='alter index '||index_name||' rebuild'; 使用存储过程执行,稍微安慰.
还要注意alter table move过程中会产生锁,应该避免在业务高峰期操作!
另外说明:truncate table jk_test 会执行的更快,而且其所占的空间也会释放,应该是truncate 语句执行后是不会进入oracle回收站(recylebin)的缘故.如果drop 一个表加上purge 也不会进回收站(在此里面的数据可以通过flashback找回).
不管是delete还是truncate 相应数据文件的大小并不会改变,如果想改变数据文件所占空间大小可执行如下语句:
重定义数据文件的大小(不能小于该数据文件已用空间的大小).
另补充一些PURGE知识
Purge操作:
①.). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
第二段:如果某些表占用了数据文件的最后一些块,则需要先将该表导出或移动到其他的表空间中,然后删除表,再进行收缩.不过如果是移动到其他的表空间,需要重建其索引.
SQL?alter?table?t_obj?move?tablespace?t_tbs1;?---移动表到其它表空间
也可以直接使用exp和imp来进行
SQLalter?owner.index_name?rebuild;??--重建索引
很大可能是原来表是压缩过的,再导进去就没有压缩了,要重新压缩下
--找出目前TEST表空间最大的block_id
SELECT MAX(block_id)FROM dba_extentsWHERE tablespace_name = 'TEST';
MAX(BLOCK_ID)
-------------?
show parameter db_block_size ;
NAME???? ? TYPE? VALUE
------------------------------------ ----------- ------------------------------
MAX(M)
----------
--查看表空间物理文件的名称及大小
select
"total_space(M)"from dba_data_fileswhere tablespace_name ='TEST' ;
TABLESPACE_NAME ? ? ? ? ?FILE_ID ? ?FILE_NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? total_space(M)
------------------------------ ---------- -------------------------------------------------- --------------
--resize表空间
SQL ALTER DATABASE DATAFILE '/u01/oradata/source/test01.dbf' RESIZE 1M;
ALTER DATABASE DATAFILE '/u01/oradata/source/test01.dbf' RESIZE 1M*ERROR at line 1:
Database altered.
给您提供建议如下:
(1)如果表空间的数据没存满,可以考虑执行表空间收缩操作.
删除数据不能缩小表空间,只是可再利用的多了.
要实际缩小,让操作系统可以利用,需要先把表move tablespace
也可以在原来的tablespace上move一遍,再缩小tablespace就可以了.
例如:
alter table your_table move tablespace yourtablespace;
以上就是土嘎嘎小编为大家整理的oracle如何收缩表相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!