2013-09-25 75 views
2

發現這個hereOracle索引 - 全表掃描/鎖定

在一般情況下,考慮在以下任何一種情況下創建一個列的索引:

  • 參照完整性約束的索引的存在列或 列。如果您更新父表主鍵,將 合併到父表中或從父表中刪除,索引是避免完全表鎖的一種方法,否則將會需要 。

我不明白爲什麼在這種情況下會發生全表鎖。我會想,如果我試圖刪除/更新父表中的主鍵,將在子表上執行全表掃描。

鎖從哪裏來?

回答

5

看看這個Tom Kyte博客條目。其中,他提到Oracle documentation,其中提供了此解釋:

  • 防止子表上的全表鎖定。相反,數據庫獲取索引上的行鎖。
  • 刪除需要對子表進行全表掃描。作爲說明,假定用戶從部門表中刪除部門10的記錄。如果employees.department_id沒有索引,那麼數據庫必須掃描的員工,看看是否在部門10

存在任何員工在第一種情形,如果列沒有被索引,整個表格必須被鎖定,因爲Oracle不知道哪些行必須在子表中更新。通過索引,Oracle可以識別有問題的行並鎖定它們。如果沒有完整的表鎖,就可以修改父項,並讓另一個會話將該項修改爲違反約束條件的項。