2011年3月23日 星期三

select 是否會使用 undo segment?

根據 Ask Tom的文章,我做了些實驗,得到的結論如文章中所描述:
  • 單純的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找出兇手的時候)可就糗了...

沒有留言:

張貼留言