oracle - 外键索引可以是另一个索引的一部分还是应该是独立的?
问题描述
我在 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 的专家一对一 Oracle)是这样做:
alter table issues disable table lock;
现在,如果您尝试像这样更新父表:
update locations set location_id_fin = <new value>;
你会得到这个错误:
ORA-00069: 无法获取锁 -- 为 CHILD 禁用表锁
但是,一旦您添加以外键列开头的索引,您将得到预期的错误:
ORA-02292: 违反完整性约束 (xxx) - 找到子记录
推荐阅读
- python - Django - 外部 URL 链接
- json - 如何在 json 文件中使用 mustache 标签并从 Vue 中获取值?
- shell - Xamarin 表单:可以在内容页面上以编程方式在 Shell App 中添加选项卡
- ios - UIDocumentPickerViewController 没有在 Mac Catalyst 上调用 didPickDocumentAtURL
- vuetify.js - 有没有办法排除 Vuetify 的 _typography.sass?
- javascript - 根据条件移除 div 滚动条
- hive - 给 Hive 查询提供 MapReduce 参数
- r - 通过匹配将列值重命名为R中的单独列
- python - 一次比较 3 个元素的列表的交集
- laravel - 如何获取数据库laravel中的特定记录?