在創建數據庫實例時,它將被分成幾個稱為表空間的邏輯段,例如系統表空間和臨時表空間。壹個表空間可以包含多個數據區和壹個或多個自由範圍塊,即自由空間。
表空間、段、範圍和空閑空間之間的邏輯關系如下:
在表空間中生成段時,將從表空間的有效空閑空間中為該段的初始範圍分配空間。當這些初始範圍充滿數據時,該段將請求添加另壹個範圍。這個擴展過程將壹直持續,直到達到最大範圍值,或者表空間中沒有空閑空間用於下壹個範圍。
理想狀態是壹個段的數據可以存儲在單個範圍內。這樣,所有數據都存儲在靠近段中其他數據的位置,並且可以少用壹些指針來查找數據。然而,在很多情況下,壹個段包含多個範圍,並且沒有措施來確保這些範圍被相鄰地存儲。當要滿足壹個空間需求時,數據庫將不再合並相鄰的空閑範圍(除非沒有其他選擇),而是在表空間中找到最大的空閑範圍來使用。這樣就會逐漸形成越來越多的離散的、分離的、更小的自由空間,也就是碎片。
表空間段區塊關系
按下=y
grants = y indexes = y tables =(table 1,table 2);
導出成功後,刪除庫中的這兩個表,並導入數據:
imp用戶/密碼文件=exp.dmp commit=y buffer=64000表=(table1,table 2);
除了exp/imp,還可以使用shrink table或alter table tbname move。
具體參考:
Oracle 10g收縮表的詳細說明
/天樂軟件/archive/2009/11/03/4764254 . aspx
壹個小腳本:
-1.清理空間碎片;
tmp _ val varchar 2(500);
開始
對於REC IN(從用戶表中選擇表名)
環
tmp_val:='ALTER TABLE '||user。TABLE _ NAME | | ' MOVE
開始
立即執行tmp _ val
DBMS _ output . put _ line(tmp _ val);
例外
當別人
然後
DBMS_OUTPUT.put_line('錯誤:' || tmp_val || '!');
結束;
結束循環;
(2)索引段的碎片整理
重建索引(碎片整理後,很多索引會變得不可用,重建後,讓它變成void)
對於REC IN(SELECT INDEX _ NAME FROM USER _ INDEXES)-其中STATUS='UNUSABLE '
環
tmp_val:='ALTER INDEX '||REC。INDEX _ NAME | | ' REBUILD
開始
立即執行tmp _ val
DBMS _ output . put _ line(tmp _ val);
例外
當別人
然後
DBMS_OUTPUT.put_line('錯誤:' || tmp_val || '!');
結束;
結束循環;
結束;