淺談Rowid中的行號

space6212發表於2019-06-01

我們知道,rowid的最後三位是儲存當前行在block中的行號。那麼這個行號是什麼東西呢?是不是就和rownum是一個概念呢?
是不是插入越晚的記錄,行號就越大呢?


下面用試驗來驗證。
首先建立測試表:
SQL> create table t(id int primary key);

Table created


插入記錄:
insert into t values(1);

SQL> select id,
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;

ID ROWID OBJ_ID DF# BLKNUM ROWNO
---------- ------------------ ---------- ---------- ---------- ----------
1 AAAB8XAAGAAAHRSAAA 7959 6 29778 0
2 AAAB8XAAGAAAHRSAAB 7959 6 29778 1

可見,在不提交的情況下,表t的資料已經有行號了。
也就是說,資料在插入資料時,資料行的rowid就已經確定,它就已經預定了塊中的某部分空間了(即使它沒有被寫入資料檔案)。
這個rowid與是否提交、資料是否重新整理到物理檔案上無關。
且在rowid中,行號是以0開始的。

接著看以下試驗:
會話一:
SQL> insert into t values(3);

1 row inserted

SQL>
SQL> select id,
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;

ID ROWID OBJ_ID DF# BLKNUM ROWNO
---------- ------------------ ---------- ---------- ---------- ----------
1 AAAB8XAAGAAAHRSAAA 7959 6 29778 0
2 AAAB8XAAGAAAHRSAAB 7959 6 29778 1
3 AAAB8XAAGAAAHRSAAD 7959 6 29778 3


會話二:
SQL> insert into t values(4);

1 row inserted

SQL> select id,
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;

ID ROWID OBJ_ID DF# BLKNUM ROWNO
---------- ------------------ ---------- ---------- ---------- ----------
1 AAAB8XAAGAAAHRSAAA 7959 6 29778 0
2 AAAB8XAAGAAAHRSAAB 7959 6 29778 1
4 AAAB8XAAGAAAHRSAAF 7959 6 29778 5

SQL> commit;

Commit complete

會話一:
回滾並插入新記錄。

SQL> select id,
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7 from t;

ID ROWID OBJ_ID DF# BLKNUM ROWNO
---------- ------------------ ---------- ---------- ---------- ----------
1 AAAB8XAAGAAAHRSAAA 7959 6 29778 0
2 AAAB8XAAGAAAHRSAAB 7959 6 29778 1
5 AAAB8XAAGAAAHRSAAC 7959 6 29778 2
4 AAAB8XAAGAAAHRSAAF 7959 6 29778 5

從以上試驗可以得知:
這裡的行號是表示行在block中儲存的位置,它與rownum是完全不同的兩個概念。
行號越大的記錄在block中存放的位置越靠後,但並非越晚插入的記錄行號越大。
oracle在一個block中插入資料時,總是優先考慮block前面的空閒空間的。
如果刪除了block前面的資料,那麼後插入的資料就有可能被放置在block的前面,這種情況下,插入時間晚,行號反而更小。

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

相關文章