我有这个问题:
select file_id, block_id first_block, block_id+blocks-1 last_block,
segment_name
from dba_extents
where tablespace_name = 'USERS'
union all
select file_id, block_id, block_id+blocks-1, 'free'
from dba_free_space
where tablespace_name = 'USERS'
order by file_id, first_block DESC;
它显示了很多“免费”片段。有很多桌子介于两者之间。
我使用以下方式移动表:
Alter table table_name move;
我有2000个这样的表。有没有办法可以完全移动它,以便我可以从表空间中回收所有可用空间?
要实现您的目标,您必须移动表空间中的所有对象,而不仅仅是表。至少您必须移动表然后重建所有索引,因为当您移动表时,在此表上构建的所有索引都将失效。您不能将所有表一起移动,但您可以通过以下方式获取所有命令:
select 'alter table ' ||table_name ||' move;'
from dba_tables where tablespace_name = 'YOURTABLESPACENAME';
要重建索引:
select 'alter index ' ||index_name ||' rebuild;'
from dba_indexes where tablespace_name = 'YOURTABLESPACENAME' and status <>'VALID';
注意:此程序不完整,可以有不同类型的索引。
注意:要获得最佳结果,您应该在不同的表空间中移动对象。
一个更简单的方法可以解释为here:本文描述了如何使用针对Oracle数据库表的shrink命令来回收有缺陷的空间。
如果你想要一个详细的程序,请给我以下查询的结果:
select distinct segment_type from dba_segments where tablespace_name='YOURTABLESPACENAME';