之前研究過rowid的自增:https://blog.csdn.net/qq_40687433/article/details/78466488
並研究到rowid的跳躍:https://blog.csdn.net/qq_40687433/article/details/88863234
當時的表狀態如下
ROWID DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)
------------------ ----------------------------------
AAAGTsAABAAAQuBAAA 0
AAAGTsAABAAAQuBAAC 2
當時比較迷惑,爲什麼insert一條數據,會是AAC,而不是AAB。(在行記錄較小的情況下)。因爲在學習了rowid自增後,我們理解是rowid在空塊的情況下插入,就是按順序自增的。
爲什麼這裏會跳行號呢?
我們把上一篇的實驗做完以後
然後繼續刪除第二行,再插入,看會發生什麼
SQL> delete from testr where rowid='AAAGTsAABAAAQuBAAC';
1 row deleted.
SQL> commit;
Commit complete.
SQL> insert into testr values(5);
1 row created.
SQL> commit;
Commit complete.
SQL> select rowid,dbms_rowid.rowid_row_number(rowid) from testr;
ROWID DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)
------------------ ----------------------------------
AAAGTsAABAAAQuBAAA 0
AAAGTsAABAAAQuBAAB 1
2 rows selected.
很神奇的是,新增的第二行,又是AAB了(之前是AAC)。
我們再把全部的數據刪除,再插入。
SQL> delete from testr;
2 rows deleted.
SQL> commit;
Commit complete.
SQL> insert into testr values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> insert into testr values(2);
1 row created.
SQL> commit;
Commit complete.
SQL> select rowid,dbms_rowid.rowid_row_number(rowid) from testr;
ROWID DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)
------------------ ----------------------------------
AAAGTsAABAAAQuBAAC 2
AAAGTsAABAAAQuBAAD 3
2 rows selected.
rowid行號又不從0開始了。爲什麼呢?
我們之前插入數據都可以以連續的行號來代表數據行,但是在此插入又是不連續的。同樣是delete,insert,爲什麼得到的結果會不一樣?
其實問題很簡單,我們2次試驗的區別在於:時間間隔
當我第一次試驗時delete的AAC數據和我最後一次插入AAB數據之間時間差大於了undo的保留時間
而我第二次試驗在短時間內完成了插入刪除插入。實際上delete並沒有完全刪除數據,只是我們查詢不到,這個時候這條delete的數據爲UNEXPIRED狀態,在過了900s(默認)時,delete的這個數據爲EXPIRED。這個時候再插入,就可以佔用這個“坑位”
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDO1
--數據庫默認undo爲900s,在距離我們上次delete數據15分鐘後我們再插入數據
SQL> !date
Thu Mar 28 11:12:00 CST 2019
SQL> !date
Thu Mar 28 11:27:00 CST 2019
delete from testr; --實際上這一步不用做,這是刪除了2、3坑位,0、1坑位已經空出來了
commit;
insert into testr values(9);
commit;
insert into testr values(8);
commit;
select rowid,dbms_rowid.rowid_row_number(rowid) from testr;
SQL> select rowid,dbms_rowid.rowid_row_number(rowid) from testr;
ROWID DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)
------------------ ----------------------------------
AAAGTsAABAAAQuBAAA 0
AAAGTsAABAAAQuBAAB 1
結果如我們所料。