我有这个问题:
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张这样的表。有没有办法可以完全移动它,以便我可以从表空间中回收所有可用空间?
答案 0 :(得分:1)
要实现目标,您必须移动表空间中的所有对象,而不仅仅是表。 至少您必须移动表然后重建所有索引,因为当您移动表时,在此表上构建的所有索引都将失效。 您不能将所有表一起移动,但可以通过以下方式获取所有命令:
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';