淺談Rowid中的行號
我們知道,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中的_rowidMySql
- 淺談中國代購行業行業
- 淺談JavaScript中的thisJavaScript
- 淺談react 中的 this 指向React
- 淺談Java中的HashmapJavaHashMap
- 淺談java中的反射Java反射
- 淺談React中的diffReact
- 淺談:js後加?v=版本號的原因JS
- 淺談JS中的非同步和單執行緒JS非同步執行緒
- 淺談C++11中的多執行緒(三)C++執行緒
- 淺談C++11中的多執行緒(一)C++執行緒
- 【ROWID】Oracle rowid說明Oracle
- 淺談Golang中select的用法Golang
- 淺談JavaScript中的繼承JavaScript繼承
- 淺談python中的xpath用法Python
- 淺談jQuery中的工具方法jQuery
- 淺談Kotlin中的函式Kotlin函式
- 淺談CSS中的Position(定位)CSS
- 淺談Netty的執行緒模型Netty執行緒模型
- 淺談tomcat執行模式Tomcat模式
- 淺談JS執行緒JS執行緒
- 淺談並行測試並行
- 淺談多執行緒執行緒
- 執行緒概念淺談執行緒
- 淺談Android中LifecycleAndroid
- 淺談SAP諮詢行業的衰落行業
- 淺談 js 中的 this 指向問題JS
- 淺談Swift中的函式式Swift函式
- 淺談java中的併發控制Java
- 淺談Java中的內部類Java
- 淺談Javascript中的作用域鏈JavaScript
- 淺談 Swift 中的屬性(PropertySwift
- 淺談Java中的淺拷貝和深拷貝Java
- 淺談 Java多執行緒Java執行緒
- 淺談node.js中的stream(流)Node.js
- 淺談JavaScript中的apply、call和bindJavaScriptAPP
- 淺談Node中module的實現原理
- MySQL中int、char、varchar的效能淺談MySql