2016-08-02 51 views
0

我有這個疑問:甲骨文 - 將所有表格和回收自由空間

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

免費部分將被重新用作表增長;你確定有必要回收這個空間 - 它不會晚些時候被重用嗎? –

+0

@AlexPoole - 是的,我想釋放我的表空間。 – dang

+0

文章如何從AskTom回收空間(日期爲2006年) https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:54178027703899 – are

回答

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命令來回收wated空間。

如果你想有一個詳細的程序給我下面的查詢結果:

select distinct segment_type from dba_segments where tablespace_name='YOURTABLESPACENAME';