ORACLE 收縮表空間的資料檔案

2021-06-10 10:06:23 字數 2450 閱讀 9277

在實際的應用中經常會遇到truncate或者delete表中的資料後發現表空間並沒有將空間進行釋放,磁碟空間被告占用感覺空間白白被浪費掉了。

提供乙個**表空間的簡單方法供參考:

通過下面的sql語句檢視表空間總大小及實用大小,然後拼出來乙個sql語句將表空間的資料檔案重新設定大小

select 'alter database datafile ''' || a.file_name || ''' resize ' ||

round(a.filesize - (a.filesize - c.hwmsize - 100) * 0.8) || 'm;',

a.filesize || 'm' as "資料檔案的總大小",

c.hwmsize || 'm' as "資料檔案的實用大小"

from (select file_id, file_name, round(bytes / 1024 / 1024) as filesize

from dba_data_files) a,

(select file_id, round(max(block_id) * 8 / 1024) as hwmsize

from dba_extents

group by file_id) c

where a.file_id = c.file_id

and a.filesize - c.hwmsize > 100;

上面的那個sql語句執行可能是有點慢下面的語句更快:

注意:對於此sql語句由於dba_free_space這個檢視在統計空閒空間時沒有考慮表空間中的資料檔案自動擴充套件時產生的可使用空間。同時,對於分配給行的空間,在刪除行以後,仍可繼續用於表的插入操作,但不將其作為可用於其他資料庫物件的空間算入下面sql查詢結果中,但是對於擷取表時,該空間就可用於其他的資料庫物件。如果不考慮資料檔案擴充套件的情況下用此sql語句基本上可以滿足要求了,如果要很精確的話可以考慮上面sql語句就是太慢了點。

select a.tablespace_name,

a.file_name,

a.totalsize,

b.freesize,

'alter database datafile ''' || a.file_name || ''' resize ' ||

round((a.totalsize - b.freesize) + 200) || 'm;' as "alter datafile"

from (select a.file_name,

a.file_id,

a.tablespace_name,

a.bytes / 1024 / 1024 as totalsize

from dba_data_files a) a,

(select b.tablespace_name,

b.file_id,

sum(b.bytes / 1024 / 1024) as freesize

from dba_free_space b

group by b.tablespace_name, b.file_id) b

where a.file_id = b.file_id

and b.freesize > 100

and a.tablespace_name not like 'undo%'

從網上查了乙個關於**表空間的語句:

alter tablespace tablespacename coalesce

此語句是整合表空間的碎片增加表空間的連續性,但是他不會收縮乙個檔案的大小的。

**某個表使用空間的步驟:(1

)、選擇某個表空間中超過n個

blocks

的segments

,通過此語句可以看出那個表占用的空間大。

select segment_name,segment_type,blocks from dba_segments

where tablespace_name='tablespacename'

and blocks > n

order by blocks;

(2)、分析表,得知表的一些資訊

analyze table tablename estimate statistics;

執行完後再執行

select initial_extent,next_extent,min_extents,blocks,empty_blocks from dba_tables

where table_name='hisholdsinfo' and owner='hs_his';

(3)、使用

alter table ... deallocate unused 

命令**表的空間

例如:alter table hs_his.hisholdsinfo' deallocate unused keep 1k;

mysql收縮空間 Oracle表空間收縮方案

對於表空間收縮,oracle只提供擴大的功能,而不提供收縮。所以,要實現這樣的要求,就只能先建立乙個中間表空間,然後將待收縮表 應用背景 某些情況下,由於前期設計上沒有考慮全面,導致表空間預建太大,遠遠超出實際使用大小。於是,就出現了收縮表空間這樣的需求,即將這個表空間的占用空間進行收縮。處理方案 ...

Oracle 表空間收縮

業務表頻繁寫入,刪除,清空後,表占用的空間不能夠及時釋放,需要通過如下方式手工釋放空間。更新業務表統計資訊 call dbms stats.gather table stats user name table name 收縮業務表空間占用 alter table enable row movemen...

ORACLE 收縮表空間的資料檔案

方法一 在實際的應用中經常會遇到truncate或者delete表中的資料後發現表空間並沒有將空間進行釋放,磁碟空間被告占用感覺空間白白被浪費掉了。通過下面的sql語句檢視表空間總大小及實用大小,然後拼出來乙個sql語句將表空間的資料檔案重新設定大小 select alter database da...