rowid的繼承和undo_retention

之前研究過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

結果如我們所料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章