微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。