首页 > 解决方案 > 外键索引可以是另一个索引的一部分还是应该是独立的?

问题描述

我在 Oracle 18 中有一个带有主键的索引组织表

主键(ISSUE_ID、LOCATION_ID_FIN、PRODUCTNUMBER、LOCATION_ID_COMPONENT、LOCAL_PART_NUMBER)

问题表(issue_id)有一个外键,位置表有两个(LOCATION_ID_FIN 和 LOCATION_ID_COMPONENT)。

我不会在 issue_id 上创建单独的索引,因为它位于首位,但我应该为 LOCATION_ID_FIN 和 LOCATION_ID_COMPONENT 创建单独的外键索引,还是这些列包含在主键中就足够了?

(这个问题假设需要一个外键索引来避免任何锁定(tm-contention))

数据库版本为 18,下周迁移到 19c

标签: oracleindexingforeign-keys

解决方案


是的,您确实需要以外键列开头的索引。证明这一点的一种方法(来自 Tom Kyte 的专家一对一 Oracle)是这样做:

alter table issues disable table lock;

现在,如果您尝试像这样更新父表:

update locations set location_id_fin = <new value>;

你会得到这个错误:

ORA-00069: 无法获取锁 -- 为 CHILD 禁用表锁

但是,一旦您添加以外键列开头的索引,您将得到预期的错误:

ORA-02292: 违反完整性约束 (xxx) - 找到子记录


推荐阅读