2

在这里找到这个:

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

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

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

锁从何而来?

4

1 回答 1

5

看看这个Tom Kyte博客条目。在其中,他提到了Oracle 文档,其中提供了以下解释:

  • 防止子表上的全表锁定。相反,数据库获取索引上的行锁。
  • 无需对子表进行全表扫描。例如,假设用户从部门表中删除部门 10 的记录。如果 employees.department_id 没有索引,那么数据库必须扫描员工以查看部门 10 中是否存在任何员工。

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

于 2013-09-25T13:06:19.920 回答