外键索引可以是另一个索引的一部分还是应该是独立的?

问题描述

我在 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

解决方法

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

alter table issues disable table lock;

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

update locations set location_id_fin = <new value>;

你会得到这个错误:

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

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

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