Oracle索引 - 全表扫描/锁定

时间:2013-09-25 12:49:35

标签: oracle indexing full-table-scan table-lock

找到此here

通常,请考虑在以下任何一种情况下在列上创建索引:

  • 索引列上存在参照完整性约束或 列。索引是一种避免全表锁定的方法 否则,如果您更新父表主键,则需要 合并到父表中,或从父表中删除。

我不明白为什么在这种情况下会发生全表锁。我想如果我试图删除/更新父表中的主键,那么将对子表执行全表扫描。

锁从哪里来?

1 个答案:

答案 0 :(得分:5)

查看此Tom Kyte博客条目。在其中,他引用了Oracle documentation,其中提供了这种解释:

  • 防止子表上的完整表锁定。而是,数据库获取索引上的行锁。
  • 无需对子表进行全表扫描。作为说明,假设用户从departments表中删除了部门10的记录。如果未对employees.department_id编制索引,则数据库必须扫描员工以查看部门10中是否存在任何员工。

在第一种情况下,如果列未编制索引,则必须锁定整个表,因为Oracle不知道必须在子表中更新哪些行。使用索引,Oracle可以识别有问题的行并锁定它们。如果没有完整的表锁,则可以修改父级并让另一个会话将子级修改为违反约束的内容。