问题描述
我在 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) - 找到子记录