- 單純的select 並不會使用到undo segment;
- 對於一個有一筆紀錄以上的Table來說,只要select statement 尾巴多加了 for update,就會用到undo segment。
我先建立一個測試表格T(char(1)),並insert了一筆資料,隨後進行以下的測試:
SQL> select used_ublk from v$transaction; 沒有任何資料列被選取 SQL> truncate table t; 表格被截斷. SQL> select used_ublk from v$transaction; 沒有任何資料列被選取 SQL> insert into t values('1'); 已建立 1 個資料列. SQL> commit; 確認完成. SQL> select used_ublk from v$transaction; 沒有任何資料列被選取 SQL> select * from t for update; T1 -- 1 SQL> select used_ublk from v$transaction; USED_UBLK ---------- 1 SQL> commit; 確認完成. SQL> select used_ublk from v$transaction; 沒有任何資料列被選取 SQL> |
請注意以上紅色部分,不管你有沒有異動T Table內的資料,只要一旦下了 for update,undo space就會備準備出來儲存現有的資料列版本,而且更恐怖的是Table Lock也同時跟著發生。一旦有其它 transaction 要進行異動,那真的是死在那邊等你解了。所以千萬小心、在意 for update用完要趕快commit以釋放undo space跟table lock,否則大禍臨頭(DBA找出兇手的時候)可就糗了...