DAILY TIP-1:行遷移以及消除
2024-07-21 02:36:02
供稿:網友
Row Migration,是Oracle里面的一個重要的基本概念。
一般傳統意義上,我們需要消除行遷移。 因為這樣,會造成額外的IO消耗。傳統的辦法一般是導入倒出整個表。
但是這樣的風險比較大,而且Downtime會比較長。
當有外鍵約束之類的時候,也非常的麻煩。
也有人選擇用刪除migration的行,然后重新Insert ,但是和EXP/Imp一樣,當遭碰到FK/PK限制的時候,也會很頭疼。
我們可以用下面的辦法來最方便的進行重組,消除row migration:
SQL> alter table t add t1 date default sysdate;
Table altered.
SQL> c/t1/t2
1* alter table t add t2 date default sysdate
SQL> /
Table altered.
SQL> c/t2/t3
1* alter table t add t3 date default sysdate
SQL> /
Table altered.
SQL> analyze table t compute statistics;
Table analyzed.
SQL> select table_name,num_rows,CHAIN_CNT from user_tables where table_name='T';
TABLE_NAME NUM_ROWS CHAIN_CNT
------------------------------ ---------- ----------
T 41616 3908
SQL> alter table t move ;
Table altered.
SQL> analyze table t compute statistics;
Table analyzed.
SQL> select table_name,num_rows,CHAIN_CNT from user_tables where table_name='T';
TABLE_NAME NUM_ROWS CHAIN_CNT
------------------------------ ---------- ----------
T 41616 0
這里我們也看到了隨便向表里面添加字段的不良后果,數據庫設計時候的不注重
尤其是添加字段的時候,還有一個Default值。
產生行遷移的原因在于,假如PCTFREE的值太小,當用UPDATE語句更新一行數據時,可能使該行的數據增加,從而使其在一個數據塊內存放不下。這時ORACLE就尋找能容納下該行的數據塊,假如能找到這樣的塊,便把該行全部存入新塊中,而在原來的數據塊上寫入指向新塊的地址。