Oracle資料庫關於錶行連線和行遷移處理方案

it-msxq發表於2011-03-30
如果資料庫中存在行連結,行遷移,將會嚴重影響資料庫的效能。因此,我們應該想辦法消除行連結和行遷移。這樣的操作是否影響表的正常操作(比如現在使用者正在使用這些表,我們做行連結,行遷移操作)。

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

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

STEP3:查出連結行或者遷移行

SELECT *

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

STEP4:建立中間表

CREATE TABLE int_t_bs_hotal


AS SELECT *
FROM t_bs_hotal

WHERE ROWID IN
(SELECT HEAD_ROWID
FROM CHAINED_ROWS
WHERE TABLE_NAME = t_bs_hotal);
中間表int_t_bs_hotal用於臨時存放連結行或者遷移行。該表的結構必須和表t_bs_hotal(本例中的表)的結構完全相同。執行完上面的命令,連結行或者遷移行已經被插入到中間表int_t_bs_hotal中。

STEP5:從已經存在的表t_bs_hotal中刪除連結行和遷移行

DELETE FROM t_bs_hotal


WHERE ROWID IN
(SELECT HEAD_ROWID
FROM CHAINED_ROWS
WHERE TABLE_NAME = t_bs_hotal);

STEP6:把中間表中的資料插入已經存在的表t_bs_hotal

INSERT INTO t_bs_hotal


SELECT *
FROM int_t_bs_hotal;

這一步使原來的資料行被重新插入,從而消除行遷移。

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

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

相關文章