【Oracle】-【COMMIT對索引的影響】-從trace看COMMIT對索引的影響
之前看過老楊http://yangtingkun.itpub.net/post/468/231000的一篇文章,講述了INSERT操作對全文索引無操作,但DELETE時為了防止刪除的資料仍能通過索引的ROWID訪問產生的錯誤,此時會進行索引的刪除操作,因此大批量的DELETE-COMMIT就會耗時,甚至導致資料庫掛起。
最近因為工作上的需求,有個任務涉及到資料遷移,因此一直關注COMMIT耗時的問題,就想按照老楊的方法,看看對於普通索引,上述所說的COMMIT是否有影響。
測試環境:Oracle 10.2.0.4+Linux x86_64
用例1:INSERT後COMMIT操作。
SQL> create table t as select * from dba_objects;
Table created.
SQL> create index t_idx on t(object_id);
Index created.
SQL> insert into t(object_id) values(1);
1 row created.
SQL> alter session set sql_trace=true;
Session altered.
SQL> commit;
Commit complete.
SQL> alter session set sql_trace=false;
Session altered.
用例2:DELETE後COMMIT操作。
重登陸
SQL> delete from t where object_id=1;
1 row deleted.
SQL> alter session set sql_trace=true;
Session altered.
SQL> commit;
Commit complete.
SQL> alter session set sql_trace=false;
Session altered.
這裡重登陸再trace是為了防止重用會話快取的遊標,從而使結果更清晰。
用例1的trace檔案:
*** 2013-07-31 08:56:57.328
*** ACTION NAME:() 2013-07-31 08:56:57.328
*** MODULE NAME:(sqlplus@vm-vmw4131-t (TNS V1-V3)) 2013-07-31 08:56:57.328
*** SERVICE NAME:(SYS$USERS) 2013-07-31 08:56:57.328
*** SESSION ID:(508.20733) 2013-07-31 08:56:57.327
=====================
PARSING IN CURSOR #1 len=6 dep=0 uid=0 ct=44 lid=0 tim=1343000212234337 hv=3480936638 ad='0'
commit
END OF STMT
PARSE #1:c=0,e=54,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343000212234330
XCTEND rlbk=0, rd_only=0
EXEC #1:c=0,e=374,p=0,cr=0,cu=1,mis=0,r=0,dep=0,og=0,tim=1343000212235249
=====================
PARSING IN CURSOR #2 len=33 dep=0 uid=0 ct=42 lid=0 tim=1343000219675725 hv=525901419 ad='0'
alter session set sql_trace=false
END OF STMT
PARSE #2:c=0,e=47,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343000219675717
EXEC #2:c=0,e=28,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343000219675914
用例2的trace檔案:
*** 2013-07-31 08:57:43.829
*** ACTION NAME:() 2013-07-31 08:57:43.828
*** MODULE NAME:(sqlplus@vm-vmw4131-t (TNS V1-V3)) 2013-07-31 08:57:43.828
*** SERVICE NAME:(SYS$USERS) 2013-07-31 08:57:43.828
*** SESSION ID:(508.20743) 2013-07-31 08:57:43.828
=====================
PARSING IN CURSOR #3 len=6 dep=0 uid=0 ct=44 lid=0 tim=1343000257645312 hv=3480936638 ad='0'
commit
END OF STMT
PARSE #3:c=0,e=130,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343000257645304
XCTEND rlbk=0, rd_only=0
EXEC #3:c=0,e=424,p=0,cr=0,cu=1,mis=0,r=0,dep=0,og=0,tim=1343000257646177
=====================
PARSING IN CURSOR #1 len=33 dep=0 uid=0 ct=42 lid=0 tim=1343000265207698 hv=525901419 ad='0'
alter session set sql_trace=false
END OF STMT
PARSE #1:c=0,e=50,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343000265207690
EXEC #1:c=0,e=31,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343000265207917
由此可見,兩種操作後的trace顯示僅僅包含COMMIT操作,並沒有類似文章中提到的對全文索引那樣的維護操作。換句話說,我理解COMMIT操作自身除觸發LGWR外,沒有其它的耗時。如果COMMIT的時間長,一方面可能是LGWR的問題,另一方面可能是COMMIT之前的操作問題,需要具體問題具體分析。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7192724/viewspace-767511/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CONTEXT索引對COMMIT操作的影響 (ZT)Context索引MIT
- shrink 操作對索引的影響索引
- Update操作對索引的影響索引
- 【Oracle】-【ROWNUM與索引】-索引對ROWNUM檢索的影響Oracle索引
- oracle點陣圖索引對DML操作的影響Oracle索引
- shrink 與rebuild對索引高度的影響對比Rebuild索引
- Oracle DML(非select) 操作不commit 對select的影響OracleMIT
- delete語句對索引的影響之分析delete索引
- 索引對直接路徑載入的影響索引
- 表資料的儲存對索引的影響索引
- 分割槽表的不同操作對索引的影響索引
- oracle本地分割槽索引跨分割槽對成本的影響Oracle索引
- stopkey對索引掃描的影響測試TopK索引
- 索引及排序對執行計劃的影響索引排序
- oracle分割槽表的常規操作導致對索引的影響Oracle索引
- 操作分割槽表對global和local索引的影響索引
- 資料列not null對索引影響一例Null索引
- 16、MySQL Case-索引key對select count(*)的影響MySql索引
- 對列進行連線操作會影響索引的使用索引
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- mysql event對主從的影響MySql
- 複合索引中前導列對sql查詢的影響索引SQL
- Sql Server之旅——第十站 看看DML操作對索引的影響SQLServer索引
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- 有關Oracle表分割槽進行(DML)維護後對索引的影響的分析Oracle索引
- Oracle 外來鍵索引影響阻塞問題Oracle索引
- 修改系統時間對oracle的影響Oracle
- Oracle主鍵選擇對插入的影響Oracle
- 【Oracle】修改indexed 欄位是否影響索引的有效性OracleIndex索引
- 再說索引與Null值對於Hints及執行計劃的影響索引Null
- unusable index對DML/QUERY的影響Index
- Arraysize 對consistent get的影響
- 新增欄位對SQL的影響SQL
- 語言對思維的影響
- 表資料量影響MySQL索引選擇MySql索引
- 修改主機時區對Oracle的影響分析Oracle
- 磁碟排序對Oracle資料庫效能的影響排序Oracle資料庫
- MySQL:Innodb:innodb_flush_log_at_trx_commit引數影響的位置MySqlMIT