Oracle碎片整理全面解析

2021-06-10 05:19:01 字數 3238 閱讀 9902

oracle 作為一種大型資料庫,廣泛應用於金融、郵電、電力、民航等資料吞吐量巨大,計算機網路廣泛普及的重要部門。對於系統管理員來講,如何保證網路穩定執行,如何提高資料庫效能,使其更加安全高效,就顯得尤為重要。作為影響資料庫效能的一大因素 -- 資料庫碎片,應當引起 dba 的足夠重視,及時發現並整理碎片乃是 dba 一項基本維護內容。

1、碎片是如何產生的

當生成乙個資料庫時,它會 分成稱為表空間( tablespace )的多個邏輯段( segment ),如系統( system )表空間 , 臨時( temporary )表空間等。乙個表空間可以包含多個資料範圍( extent )和乙個或多個自由範圍塊,即自由空間( free space )。

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

當表空間中生成乙個段時,將從表空間有效自由空間中為這個段的初始範圍分配空間。在這些初始範圍充滿資料時,段會請求增加另乙個範圍。這樣的擴充套件過程會一直繼續下去,直到達到最大的範圍值,或者在表空間中已經沒有自由空間用於下乙個範圍。最理想的狀態就是乙個段的資料可被存在單一的乙個範圍中。這樣,所有的資料儲存時靠近段內其它資料,並且尋找資料可少用一些指標。但是乙個段包含多個範圍的情況是大量存在的,沒有任何措施可以保證這些範圍是相鄰儲存的。當要滿足乙個空間要求時,資料庫不再合併相鄰的自由範圍(除非別無選擇),而是尋找表空間中最大的自由範圍來使用。這樣將逐漸形成越來越多的離散的、分隔的、較小的自由空間,即碎片。

2、碎片對系統的影響

隨著時間推移,基於資料庫的應用系統的廣泛使用,產生的碎片會越來越多,將對資料庫有以下兩點主要影響:

1)導致系統效能減弱

如上所述,當要滿足乙個空間要求時,資料庫將首先查詢當前最大的自由範圍,而 " 最大 " 自由範圍逐漸變小,要找到乙個足夠大的自由範圍已變得越來越困難,從而導致表空間中的速度障礙,使資料庫的空間分配愈發遠離理想狀態;

2)浪費大量的表空間

儘管有一部分自由範圍(如表空間的 pctincrease 為非 0 )將會被 smon (系統監控)後台程序周期性地合併,但始終有一部分自由範圍無法得以自動合併,浪費了大量的表空間。

3、自由範圍的碎片計算

由於自由空間碎片是由幾部分組成,如範圍數量、最大範圍尺寸等,我們可用 fsfi--free space fragmentation index (自由空間碎片索引)值來直觀體現:

fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))

可以看出, fsfi 的最大可能值為 100 (乙個理想的單檔案表空間)。隨著範圍的增加, fsfi 值緩慢下降,而隨著最大範圍尺寸的減少, fsfi 值會迅速下降。

下面的指令碼可以用來計算 fsfi 值:

rem fsfi value compute

rem fsfi.sql

column fsfi format 999,99

select tablespace_name,sqrt(max(blocks)/sum(blocks))*

(100/sqrt(sqrt(count(blocks)))) fsfi

from dba_free_space

group by tablespace_name order by 1;

spool fsfi.rep;

spool off;

比如,在某資料庫執行指令碼 fsfi.sql, 得到以下 fsfi 值:

tablespace_name fsfi

rbs 74.06

system 100.00

temp 22.82

tools 75.79

users 100.00

user_tools 100.00

ydcx_data 47.34

ydcx_idx 57.19

ydjf_data 33.80

ydjf_idx 75.55

---- 統計出了資料庫的 fsfi 值,就可以把它作為乙個可比引數。在乙個有著足夠有效自由空間,且 fsfi 值超過 30 的表空間中,很少會遇見有效自由空間的問題。當乙個空間將要接近可比引數時,就需要做碎片整理了。

4、自由範圍的碎片整理

表空間的 pctincrease 值為非 0

可以將表空間的預設儲存引數 pctincrease 改為非 0 。一般將其設為 1 ,如:

alter tablespace temp

default storage(pctincrease 1);

這樣 smon 便會將自由範圍自動合併。也可以手工合併自由範圍:

alter tablespace temp coalesce;

5、段的碎片整理

我們知道,段由範圍組成。在有些情況下,有必要對段的碎片進行整理。要檢視段的有關資訊,可檢視資料字典 dba_segments ,範圍的資訊可檢視資料字典 dba_extents 。

查詢資料段

select segment_name,tablespace_name,bytes,blocks from user_extents;

查詢索引段

select index_name,table_owner,table_name,tablespace_name from user_extents;

通過dba_segments檢視段的資訊

select tablespacee_name,count(*) nobjects,round(sum(bytes)/1024/1204/1024.2) gb,sum(blocks),sum(extents) from

dba_segments group by rollup(tablespace_name);

如果段的碎片過多,將其資料壓縮到乙個範圍的最簡單方法便是用正確的儲存引數將這個段重建,然後將舊表中的資料插入到新錶,同時刪除舊表。這個過程可以用 import/export (輸入 / 輸出)工具來完成。

export ()命令有乙個(壓縮)標誌,這個標誌在讀表時會引發 export 確定該錶所分配的物理空間量,它會向輸出轉儲檔案寫入乙個新的初始化儲存引數 -- 等於全部所分配空間。若這個表關閉, 則使用 import ()工具重新生成。這樣,它的資料會放入乙個新的、較大的初始段中。例如:

exp user/password file=exp.dmp compress=y grants=y indexes=y

tables=(table1,table2);

若輸出成功,則從庫中刪除已輸出的表,然後從輸出轉儲檔案中輸入表:

imp user/password file=exp.dmp commit=y buffer=64000 full=y

Oracle 碎片整理

我們知道,oracle作為一種大型資料庫,廣泛應用於金融 郵電 電力 民航等資料吞吐量巨大,計算機網路廣泛普及的重要部門。對於系統管理員來講,如何保證網路穩定執行,如何提高資料庫效能,使其更加安全高效,就顯得尤為重要。作為影響資料庫效能的一大因素 資料庫碎片,應當引起dba的足夠重視,及時發現並整理...

ORACLE表空間碎片整理

oracle作為一種大型資料庫,廣泛應用於金融 郵電 電力 民航等資料吞吐量巨大,計算機網路廣泛普及的重要部門。對於系統管理員來講,如何保證網路 穩定執行,如何提高資料庫效能,使其更加安全高效,就顯得尤為重要。作為影響資料庫效能的一大因素 資料庫碎片,應當引起dba的足夠重視,及時發現並 整理碎片乃...

mysql索引碎片整理 MysqL碎片整理優化

先來說一下什麼是碎片,怎麼知道碎片有多大!簡單的說,刪除資料必然會在資料檔案中造成不連續的空白空間,而當插入資料時,這些空白空間則會被利用起來.於是造成了資料的儲存位置不連續,以及物理儲存順序與理論上的排序順序不同,這種是資料碎片.實際上資料碎片分為兩種,一種是單行資料碎片,另一種是多行資料碎片.前...