如何消除行連結和行遷移

tolywang發表於2008-09-10

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

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(本例中的表)的結構完全相同。執行完上面的命令,連結行或者遷移行已經被插入到中間表int_student_infor中。

STEP5:從已經存在的表student_infor中刪除連結行和遷移行
DELETE FROM student_infor
WHERE ROWID IN
(SELECT HEAD_ROWID
FROM CHAINED_ROWS
WHERE TABLE_NAME = 'student_infor');

STEP6:把中間表中的資料插入已經存在的表student_infor中
INSERT INTO student_infor
SELECT *
FROM int_student_infor;
這一步使原來的資料行被重新插入,從而消除行遷移。

STEP7:連結行的消除
如果CHAINED_ROWS中存在連結行,只能透過提高資料塊(Data Block)的大小,使一行資料能夠被容納在一個資料塊中。但是,如果列的型別是LONG ,或者是寬度比較大的CHAR,VARCHAR2,行連結將無法避免的。

資料塊大小(Data Block Size)的選擇

    通常資料庫塊的大小都是8K,但是 對於不通的應用(OLTP,DSS)應該選擇不通的塊大小。資料庫塊大小的遵循如下的原則。
下面的情況可以選擇小尺寸資料塊:
行的寬度很小,並伴有大量的隨機訪問(Random Access)
減少塊競爭
注:選擇小尺寸資料塊會浪費大量的儲存空間,

 

下面的情況可以選擇大尺寸資料塊:


行的寬度很大,或者含有LOB欄位
應用中存在大量的順序讀(Sequential Access)
節省I/O,一次可以讀入更多的資料量
節省儲存空間

出自http://tech.it168.com/d/2008-06-13/200806131104507_2.shtml 

 

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

相關文章