append HINT 的對事務的影響

kewin發表於2009-03-21

使用append hint 可以減少redo資訊的產生,可以較快的插入資料,資料遷移。
但是使用了append 後,會阻塞其他session對TABLE 的DML操作。
在append操作完畢之後要儘快提交或者rollback。
下面的測試例子:
準備資料:
create table test as select * from dba_objects;
1) 在session-A 中,執行
insert /*+ append */ into  test select * from dba_objects;
2) 再開始一個session,命名為session-B ,執行
SQL> update test set object_id = 300;
session在等待。。
3) 這時回到session-A 的介面,檢視等待內容。
SQL> select * from v$lock
  2  where type='TM';

ADDR             KADDR                   SID TYPE          ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ---------- ------ ---------- ---------- ---------- ---------- ---------- ----------
070000004ED1ECA8 070000004ED1ECD0         20 TM         369448          0          6          0        359          1
070000004ED1EBD8 070000004ED1EC00         33 TM         369448          0          0          3        333          0

SQL> select * from dba_waiters;

WAITING_SESSION HOLDING_SESSION LOCK_TYPE                                                                      MODE_HELD                                                                                                                MODE_REQUESTED                                                                                                             LOCK_ID1   LOCK_ID2
--------------- --------------- ------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ ---------- ----------
             33              20 DML                                                                            Exclusive                                                                                                                Row-X (SX)                                                                                                                   369448          0

可以看到session 20 是執行append操作的session,擁有的Exclusive Lock, 而session 33 在申請 Row-X ,而Lock級別是不相容的。故導致session 33 等待。
看到append操作是要獲得排他鎖,導致對該TABLE 的DML操作無法正常進行。
解決辦法是執行append操作的session提交或者回顧session。

提示: DBA_WAITERS的檢視,需要執行 $ORACLE_HOME/rdbms/admin/catblock.sql 指令碼得到。

當然了,有了DBA_WAITERS的檢視,可以通過utllockt.sql 獲得lock的層級關係圖。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-573312/,如需轉載,請註明出處,否則將追究法律責任。

相關文章