Oracle索引 - 全表扫描/锁定

Rob*_*ron 2 oracle indexing table-lock full-table-scan

在这里找到:

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

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

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

锁从哪里来?

DCo*_*kie 5

看看这个Tom Kyte的博客文章.在其中,他引用了Oracle文档,其中提供了以下解释:

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

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