資料塊原理

tolywang發表於2009-09-15

             什麼是資料塊。塊的大小和標準塊的大小不同的塊叫非標準塊(Nonstandard Block)。同一資料庫中,Oracle9i及以上版本支援同一資料庫中同時使用標準塊和非標準塊。Oracle允許指定5種非標準塊(Nonstandard Block)。作業系統每次執行I/O的時候,是以作業系統的塊為單位;Oracle每次執行I/O的時候,都是以Oracle的塊為單位。Oracle資料塊大小一般是作業系統塊的整數倍。資料塊的格式(Data Block Format)塊中存放表的資料和索引的資料,無論存放哪種型別的資料,塊的格式都是相同的,塊由塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory),空餘空間(Free Space)和行資料(Row Data)五部分組成,如下圖所示。

                塊頭(header/Common and Variable):存放塊的基本資訊,如:塊的實體地址,塊所屬的段的型別(是資料段還是索引段)。 表目錄(Table Directory):存放表的資訊,即:如果一些表的資料被存放在這個塊中,那麼,這些表的相關資訊將被存放在“表目錄”中。行目錄(Row Directory):如果塊中有行資料存在,則,這些行的資訊將被記錄在行目錄中。這些資訊包括行的地址等。行資料(Row Data):是真正存放表資料和索引資料的地方。這部分空間是已被資料行佔用的空間。空餘空間(Free Space):空餘空間是一個塊中未使用的區域,這片區域用於新行的插入和已經存在的行的更新。頭部資訊區(Overhead):我們把塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory)這三部分合稱為頭部資訊區(Overhead)。頭部資訊區不存放資料,它存放的整個塊的資訊。頭部資訊區的大小是可變的。一般來說,頭部資訊區的大小介於84位元組(bytes)到107位元組(bytes)之間

                 資料塊中自由空間的使用。當往資料庫中插入(INSERT)資料的時候,塊中的自由空間會減少;當對塊中已經存在的行進行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。DELETE語句和UPDATE語句會使塊中的自由空間增加。當使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間並不一定是連續的。通常情況下,Oracle不會對塊中不連續的自由空間進行合併。因為合併資料塊中不連續的自由空間會影響資料庫的效能。只有當使用者進行資料插入(INSERT)或者更新(UPDATE)操作,卻找不到連續的自由空間的時候,Oracle才會合併資料塊中不連續的自由空間。對於塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理行連結和行遷移(Row Chaining and Migrating)行連結(Row Chaining):如果我們往資料庫中插入(INSERT)一行資料,這行資料很大,以至於一個資料塊存不下一整行,Oracle就會把一行資料分作幾段存在幾個資料塊中,這個過程叫行連結(Row Chaining)。如下圖所示:如果一行資料是普通行,這行資料能夠存放在一個資料塊中;如果一行資料是連結行,這行資料存放在多個資料塊中。行遷移(Row Migrating):資料塊中存在一條記錄,使用者執行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個資料塊中進行查詢,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行資料移到一個新的資料塊。原來的資料塊中保留一個“指標”,這個“指標”指向新的資料塊。被移動的這條記錄的ROWID保持不變。行遷移的原理如下圖所示:

              無論是行連結還是行遷移,都會影響資料庫的效能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個資料塊,執行更多的I/O.塊中自由空間的自動管理。Oracle使用點陣圖(bitmap)來管理和跟蹤資料塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:。易於使用。更好地利用空間。可以對空間進行實時調整。塊中自由空間的手動管理。使用者可以透過PCTFREE, PCTUSED來調整塊中空間的使用,這種管理方式叫手動管理。相對於自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。PCTFREE引數用於指定塊中必須保留的最小空閒空間百分例。之所以要預留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空餘空間,Oracle就會分配一個新的塊,這會產生行遷移(Row Migrating)。PCTUSED也是用於設定一個百分比,當塊中已使用的空間的比例小於這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入資料。

            行連結,行遷移的解決之道。如果資料庫中存在行連結,行遷移,將會嚴重影響資料庫的效能。因此,我們應該想辦法消除行連結和行遷移。請按照下面的步驟消除行連結和行遷移。

STEP1:建立資料字典表CHAINED_ROWS.資料字典表CHAINED_ROWS用於接收ANALYZE……LIST CHAINED ROWS的資料,資料字典表CHAINED_ROWS由指令碼UTLCHAIN.SQL 或者指令碼UTLCHN1.SQL建立。

STEP2:對錶進行分析。ANALYZE TABLE student_infor LIST CHAINED ROWS;。執行這個命令將會把分析的結果寫入表CHAINED_ROWS中。

STEP3:查出連結行或者遷移行。SELECT * FROM CHAINED_ROWS WHERE TABLE_NAME = ‘student_infor‘; OWNER_NAME TABLE_NAME CLUST... HEAD_ROWID TIMESTAMP ---------- ---------- -----... ------------------ --------- TT student_infor ... AAAAluAAHAAAAA1AAA 04-MAR-2008 TT student_infor ... AAAAluAAHAAAAA1AAB 04-MAR-2008 TT student_infor ... AAAAluAAHAAAAA1AAC 04-MAR-2008 從資料字典表中CHAINED_ROWS查詢出連結行或者遷移行。該語句將列出表student_infor中存在的連結行或者遷移行。如果表中存在連結行或者遷移行,請執行下面的步驟;如果該語句沒有任何輸出,說明該表不存在連結行或者遷移行。

STEP4:建立中間表CREATE TABLE int_student_infor AS SELECT * FROM student_infor WHERE ROWID IN (SELECT HEAD_ROWID FROM CHAINED_ROWS WHERE TABLE_NAME = ‘student_infor‘); 中間表int_student_infor用於臨時存放連結行或者遷移行。該表的結構必須和表student_infor。節省I/O,一次可以讀入更多的資料量。節省儲存空間。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-614685/,如需轉載,請註明出處,否則將追究法律責任。

相關文章