當前位置:成語大全網 - 新華字典 - oracle碎片整理求助

oracle碎片整理求助

壹. 碎片是如何產生的

當創建壹個數據庫實例時,會分成稱為表空間(tablespace)的多個邏輯段(segment),如系統(system)表空間,臨時(temporary)表空間等。壹個表空間可以包含多個數據範圍(extent)和壹個或多個自由範圍塊,即自由空間(free space)。

表空間、段、範圍、自由空間的邏輯關系如下:

當表空間中生成壹個段時,將從表空間有效自由空間中為這個段的初始範圍分配空間。在這些初始範圍充滿數據時,段會請求增加另壹個範圍。這樣的擴展過程會壹直繼續下去,直到達到最大的範圍值,或者在表空間中已經沒有自由空間用於下壹個範圍。

最理想的狀態就是壹個段的數據可被存在單壹的壹個範圍中。這樣,所有的數據存儲時靠近段內其它數據,並且尋找數據可少用壹些指針。但是壹個段包含多個範圍的情況是大量存在的,沒有任何措施可以保證這些範圍是相鄰存儲的。 當要滿足壹個空間要求時,數據庫不再合並相鄰的自由範圍(除非別無選擇), 而是尋找表空間中最大的自由範圍來使用。這樣將逐漸形成越來越多的離散的、分隔的、較小的自由空間,即碎片。

表空間(tableSpace) 段(segment) 盤區(extent) 塊(block) 關系

press=y

grants=y indexes=y tables=(table1,table2);

導出成功後,在庫中刪除這兩張表,在導入數據:

imp user/password file=exp.dmp commit=y buffer=64000 tables=(table1,table2);

除了用exp/imp,還可以使用shrink table 或者alter table tbname move 來實現。

具體參考:

Oracle 10g Shrink Table 詳解

/tianlesoftware/archive/2009/11/03/4764254.aspx

壹個小腳本:

--1.整理空間碎片;

tmp_val VARCHAR2 (500);

BEGIN

FOR REC IN (SELECT TABLE_NAME FROM USER_TABLES )

LOOP

tmp_val:='ALTER TABLE '||user.TABLE_NAME ||' MOVE';

BEGIN

EXECUTE IMMEDIATE tmp_val;

DBMS_OUTPUT.put_line (tmp_val);

EXCEPTION

WHEN OTHERS

THEN

DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');

END;

END LOOP;

(2). 索引段碎片整理

把索引重建(碎片整理後,很多索引會變成UNUSABLE狀態,必須重建後,讓它變成void狀態)

FOR REC IN (SELECT INDEX_NAME FROM USER_INDEXES ) --WHERE STATUS='UNUSABLE'

LOOP

tmp_val:='ALTER INDEX '||REC.INDEX_NAME ||' REBUILD';

BEGIN

EXECUTE IMMEDIATE tmp_val;

DBMS_OUTPUT.put_line (tmp_val);

EXCEPTION

WHEN OTHERS

THEN

DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');

END;

END LOOP;

END;