oracle刪除數(shù)據(jù)但表空間占用率沒有減小的情況
oracle刪除數(shù)據(jù)但表空間占用率沒有減小
使用delete刪除數(shù)據(jù)表空間使用率并沒有減少;
如果只保留少數(shù)數(shù)據(jù)可以使用這個方法:
先將要保留的數(shù)據(jù)insert到另外一張表中,然后執(zhí)行sql:
truncate table tablename DROP STORAGE;
解釋: 直接刪除表,并且釋放存儲空間。truncate的意思是清空表數(shù)據(jù), “DROP STORAGE”是釋放存儲空間。
然后在將備份數(shù)據(jù)還原;
oracle 大表刪除數(shù)據(jù)后,回收空間的問題
在oracle中由于表結(jié)構(gòu)設(shè)計(jì)不合理或者需要清楚老數(shù)據(jù)的時候,經(jīng)常需要對大表數(shù)據(jù)進(jìn)行清理。
一般有一下幾種方法
1.刪除大部分?jǐn)?shù)據(jù),留下小部分?jǐn)?shù)據(jù)。我們可以把需要保留的數(shù)據(jù)轉(zhuǎn)移到別的表,然后再把大表drop掉,然后改名就行了;
a) create table tablename_min as select * from tablename_max a where 需要保留的數(shù)據(jù).
b) drop table tablename_max ;
c) rename tablename_min as tablename_max ;
這樣就能清除這個大表的hwm,而且釋放掉其他空間。
2.當(dāng)刪除的數(shù)據(jù)只是一小部分?jǐn)?shù)據(jù)的話,第一種方法就不適用了。比如 3億條數(shù)據(jù),你刪除一億條數(shù)據(jù)的話,用1就不合適。
這時我們就應(yīng)該考慮使用shrink table的方式。
a) 我們可以先用delete from tablename_max;
b) 由于我們進(jìn)行了數(shù)據(jù)的delete 所以造成了 tablename_max 這張表的數(shù)據(jù)稀疏,數(shù)據(jù)塊并沒有減少,hwm也沒有減少,這樣就會影響全表掃描需要訪問更多的數(shù)據(jù)塊。這時我們可以通過shrink來重組數(shù)據(jù)使數(shù)據(jù)分布更緊密,同時降低HWM釋放空閑數(shù)據(jù)塊。
c)由于需要移動行數(shù)據(jù),數(shù)據(jù)的rowid會發(fā)生變化,所以需要設(shè)置表的row movement屬性:
alter table tablename_max enable row movement; --開啟行遷移功能。 alter table tablename_max shrink space compact;--(可以在壓縮期間進(jìn)行DML操作和查詢) ,收縮表,不會降低hwm alter table tablename_max shrink space; --( 調(diào)整HWM時將阻塞DML操作),收縮表,并且降低hwm alter table tablename_max shrink space cascade;--收縮表并降低hwm,并且回收相應(yīng)的索引。
由于我們刪除了大量的數(shù)據(jù) ,相應(yīng)的索引也進(jìn)行了刪除,這時需要對索引進(jìn)行收縮。
alter index idxname shrink space;
注意:shrink table只會針對assm(自動段空間管理)的表有用,否則會報(bào): ORA-10635: Invalid segment or tablespace type。
alter table tablename_max enable row movement語句會造成引用表tablename_max的對象(如存儲過程、包、視圖等)變?yōu)闊o效。執(zhí)行完成后,最好執(zhí)行一下utlrp.sql來編譯無效的對象。
由于是通過DML操作進(jìn)行的,會產(chǎn)生大量redo,注意archivelog目錄的空間大小問題;同時undo表空間也會暴增。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫遷移所有文件到新掛載磁盤路徑
根據(jù)實(shí)際須要,有時安裝了oracle以后須要擴(kuò)展磁盤空間時,每每是新增一個單獨(dú)的文件路徑并掛載存儲,這時便須要總體遷移數(shù)據(jù)庫文件數(shù)據(jù)庫,本文就來介紹一下Oracle數(shù)據(jù)庫遷移所有文件到新掛載磁盤路徑2024-01-01
PL/SQL遠(yuǎn)程備份和恢復(fù)Oracle數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了PL/SQL遠(yuǎn)程備份和恢復(fù)Oracle數(shù)據(jù)庫的具體方法,感興趣的小伙伴們可以參考一下2016-09-09
Oracle數(shù)據(jù)遠(yuǎn)程連接的四種設(shè)置方法和注意事項(xiàng)
Oracle數(shù)據(jù)庫的遠(yuǎn)程連接可以通過多種方式來實(shí)現(xiàn),本文我們主要介紹四種遠(yuǎn)程連接的方法和注意事項(xiàng),并通過示例來說明,接下來我們就開始介紹2014-04-04
Oracle數(shù)據(jù)庫INSERT?INTO的幾種用法舉例
INSERT INTO語句可以有多種寫法,具體取決于插入的數(shù)據(jù)來源和目標(biāo),這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫INSERT?INTO的幾種用法舉例,需要的朋友可以參考下2024-02-02
使用MySQL語句來查詢Apache服務(wù)器日志的方法
這篇文章主要介紹了使用MySQL語句來查詢Apache服務(wù)器日志的方法,五個實(shí)例均基于Linux系統(tǒng)進(jìn)行演示,需要的朋友可以參考下2015-06-06

