Sql最佳化(八):程式的可擴充套件性----direct insert的副作用

531968912發表於2016-09-13
本篇繼續介紹不合理設計導致程式可擴充套件性差的例子。 資料庫執行出賬程式時,出現enq: TM - contention等待事件,主要原因是多個程式在insert bill_invoice_*時,使用了insert /*+ append*/這一方式,本來想透過append即direct insert方式提升速度,結果產生表級鎖。這樣開帳程式相互等待,實際上是變成序列的操作了,反而影響了速度。更嚴重的是,如果是生產系統,還會導致賬單表上所有修改操作都無法進行,影響其他重要業務,這個後果就很嚴重了。[@more@]

Direct insert這一用法有其速度快的優點,但也有其缺點,必須注意適用場合。大家想一下,為什麼oracle不預設用append呢?
這裡總結一下,direct-load insert(及append,direct方式sqlldr等)適合於:
1)大量記錄的insert時使用會提升速度,因為繞過databuffer直接訪問資料檔案,且不用掃描原有block上哪些有剩餘空間,而直接分配新空間
2)單個程式,通常是資料維護時,或者臨時倒資料等
這兩種情況下,使用direct-load insert不僅速度快,還減少了資料庫data buffer的使用,對資料庫上的其他應用產生的影響也較小。

不適合:
1)少量記錄insert。因為每次insert /*+append */後會進行索引維護,少量記錄insert使用append反而慢。
2)多使用者,OLTP環境。因為append會產生表級鎖。OLTP系統除了一些批處理操作,大多數應用都不應該使用append。

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

相關文章