Oracle外键需要建索引吗?

关于Oracle中的外键,首先要说明一下。

1. 除非已定义了父表主键或唯一键约束,否则oracle将不允许创建子表的外键约束。

2. 在定义外键约束时,oracle不会自动创建索引,所以必须手动在与外键约束相关的列上创建索引。

所以我们这里要研究的是否需要在子表中创建索引,因为父表中对应的列是一定有索引的。

如果子表中的外键不创建索引,将导致两个问题。

1. 影响性能。 如果子表外键没有创建索引,那么当父表查询关联子表时,子表将进行全表扫描。

2. 影响并发。 如果子表外键没有创建索引,那么在子表进行DML操作时,将会锁住整个父表。

所以,我们应该尽量考虑在外键上面创建索引。

原文地址:https://www.cnblogs.com/soundcode/p/8675971.html

时间: 2024-10-11 04:19:16

Oracle外键需要建索引吗?的相关文章

通过在Oracle子表外键上建立索引提高性能

根据我的经验,导致死锁的头号原因是外键未加索引(第二号原因是表上的位图索引遭到并发更新).在以下两种情况下,Oracle在修改父表后会对子表加一个全表锁: 1)如果更新了父表的主键(倘若遵循关系数据库的原则,即主键应当是不可变的,这种情况就很少见),由于外键上没有索引,所以子表会被锁住. 2) 如果删除了父表中的一行,整个子表也会被锁住(由于外键上没有索引). 除了全表锁外,在以下情况下,未加索引的外键也可能带来问题: 1) 如果有ON DELETE CASCADE,而且没有对子表加索引:例如,

Oracle外键不加索引引起死锁

--创建一个表,此表作为子表 create table fk_t as select *from user_objects; delete from  fk_t where object_id is null; commit; --创建一个表,此表作为父表 create table pk_t as select *from user_objects; delete from  pk_t where object_id is null; commit; --创建父表的主键 alter table

ORACLE外键和锁

在oracle中,如果外键未加索引,对父表的修改,会导致子表被加上全表锁.这包括两种情况: 1.删除父表中的行,如果外键上没有索引,会导致子表被加上全表锁 2.更新父表的主键(根据关系数据库的原则,更新主键是一个巨大的"禁忌",所以一般不会出现这种情况),如果外键上没有索引,会导致子表被加上全表锁 虽然,在Oracle9i及以上的版本中,这些全表锁都是短期的,他们仅在DML操作期间存在,而不是在整个事务的期间都存在.但是即使如此,这些全表锁还是可能(而且确实会)导致很严重的锁定问题.

Oracle外键级联删除和级联更新

1 级联删除 Oracle在外键的删除上有NO ACTION(类似RESTRICT).CASCADE和SET NULL三种行为. 下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的主键是学生的外键. -- 班级表 CRATE TABLE TB_CLASS ( ID NUMBER NOT NULL, --班级主键 NAME VARCHAR2(50), --班级名称 CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID) ); -- 学生表 CREATE TA

Oracle 外键约束子表、父表

CREATE TABLE employees( employee_id      NUMBER(6), last_name        VARCHAR2(25) NOT NULL, email            VARCHAR2(25), salary           NUMBER(8,2), commission_pct   NUMBER(2,2), hire_date        DATE NOT NULL, ... department_id    NUMBER(4), CON

Oracle怎么查外键建在哪个表上

怎样查外键建在哪个表上 有时候删除某张表记录的时候,会报错外键约束不能删除. 如果不了解表之间的关系,可以通过以下语句查询到外键是建在哪张表上的: select * from dba_constraints where constraint_name='xxx' and constraint_type = 'R'; 例如:我的程序日志中报如下错误,我要知道外键是在那个表上. 2015-09-08 18:28:18 [ main:261597003 ] - [ ERROR ] java.sql.S

SQL(三)-主键、外键和索引

转载出处: http://www.doc88.com/p-538467175318.html 1. 主键 (1)含义:能确定一条记录的唯一标识. (2)主键设计原则:主键应当是对用户没有意义的:主键应是单列的,一遍提高连接和筛选的操作效率:主键不应更新:主键不应包含动态变化的数据,比如,时间戳.创建/修改时间列:主键应当自动生成. (3)查看方式:使用navicat premium 连接数据库,选中表格,右键-design table,选择indexes,有unique标识即为主键. 2.外键

MS SQL巡检系列——检查外键字段是否缺少索引

前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方面,网上关于MS SQL巡检方面的资料好像也不是特别多.写这个系列只是一个分享,自己的初衷是一个知识梳理.总结提炼过程,有些知识和脚本也不是原创,文章很多地方融入了自己的一些想法和见解的,不足和肤浅之处肯定也非常多,抛砖引玉,也希望大家提意见和建议.补充,指正其中的不足之处.Stay Hungry

查找没有索引的外键---网上找的

问题:     生产上曾经出现过因外键上没有索引导致死锁情况,经常需要查找没有索引的外键,以下给出从网上找到的SQL(忘记出处,见谅),整理于此备用. column columns format a20 word_wrapped column table_name format a30 word_wrapped select decode( b.table_name, NULL, '****', 'ok' ) Status,     a.table_name, a.columns, b.colu