行遷移測試實驗(轉載)

shilei1發表於2013-01-11

有兩種情況會導致表中某行資料過大,一個資料塊(data block)無法容納。第一種情況,當一行資料被插入時一個資料塊就無法容納。在這種情況下Oracle將這行資料儲存在段內的一個資料塊(chain)中。在插入資料量大的行時常會發生行連結(row chaining),例如一個包含資料型別為 LONG 或 LONG RAW 列的資料行。此時行連結不可避免。

第二種情況,原本儲存在一個資料塊(data block)內的資料行,因為更新操作導致長度增長,而所在資料塊的可用空間也不能容納增長後的資料行。在這種情況下,Oracle將此行資料遷移(migrate)到新的資料塊中。Oracle在被遷移資料行原來所在位置儲存一個指向新資料塊的指標。被遷移資料行的 rowid 保持不變。
當資料行發生連結(chain)或遷移(migrate)時,對其訪問將會造成 I/O 效能降低,因為Oracle為獲取這些資料行的資料時,必須訪問更多的資料塊(data block)。
1、建立表t1,設定pctfree為0
SQL>create table t1(id number,name varchar2(20)) pctfree 0 tablespace tbs01;

2、插入資料
SQL>insert into t1 select rownum,'AAAAAAA' from dba_objects;
SQL>commit;

3、檢視資料的分佈情況
SQL>select dbms_rowid.ROWID_RELATIVE_FNO(rowid),dbms_rowid.ROWID_BLOCK_NUMBER(rowid),id from t1 where rownum <=10;

4、更新一行
SQL>select * from t1 where id=956;
SQL>update t1 set name='AAAAAAAAAAAAAAAAAAA' where id=956;
SQL>commit;

5、檢視該行的位置是否發生變化
select dbms_rowid.ROWID_RELATIVE_FNO(rowid),dbms_rowid.ROWID_BLOCK_NUMBER(rowid),id from t1 where id=956; 

6、執行utlchain.sql,建立chained_rows表
@ ?/rdbms/admin/utlchain.sql

7、分析表t1
SQL>ANALYZE TABLE t1 LIST CHAINED ROWS INTO CHAINED_ROWS;

8、查詢分析結果
SQL> SELECT owner_name,                                                                       
  2         table_name,                                                                       
  3         count(head_rowid) row_count                                                       
  4    FROM chained_rows                                                                      
  5  GROUP BY owner_name,table_name;

OWNER_NAME                     TABLE_NAME                      ROW_COUNT
------------------------------ ------------------------------ ----------
LYX                            T1                                      1

SQL> SELECT owner_name,                                                                       
  2         table_name,                                                                       
  3         head_rowid                                                       
  4    FROM chained_rows;

OWNER_NAME                     TABLE_NAME                     HEAD_ROWID
------------------------------ ------------------------------ ------------------
LYX                            T1                             AAACX/AAEAAAAAMAAA

SQL> select * from t1 where rowid='AAACX/AAEAAAAAMAAA';

        ID NAME
---------- --------------------
       956 AAAAAAAAAAAAAAAAAAA

SQL> 

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

相關文章