日期:2014-05-16  浏览次数:20413 次

【fk_index】外键中有无索引的区别

在外键上加索引与没有索引的区别:

主要有两方面问题:一、在DML操作时的阻塞问题,二 、DML操作时的速度问题

一、阻塞问题

外键在无索引的情况下,更新主表外键关联字段时,需要为子表加4级锁(S);在有索引的情况下,更新主表外键关联字段时,需要为子表加2级锁(RS)。在子表上本来就已有RX时,S锁无法被兼容,造成更新主表阻塞。如果子表上本来没有锁,更新主表的操作不被阻塞时(更新完后我们暂时不commit),此刻,如果外键没有索引,4级锁(S)是“瞬间”加上的,然后就释放不易观察到;而在有索引的情况下,给子表加的2级锁(RS)会一直存在,直到更新主表的会话回滚或提交。

无论在有无外键索引的情况下,子表插入数据,需要给主表加2级锁(RS),这个操作是否会被阻塞,要看主表中对应的记录是否存在RX锁。这里是用delete进行的测试,其它DML语句情况相同。


1. 创建两张表并插入数据,模拟实验环境

BALLONTT@PROD> create table dept(deptno number,dname varchar2(10));

BALLONTT@PROD> alter table dept add constraint pk_dept primary key(deptno);

 

BALLONTT@PROD> create table emp(empno number,ename varchar2(10),deptno number);

BALLONTT@PROD> alter table emp add constraint fk_emp foreign key(deptno) references dept(deptno);

 

BALLONTT@PROD> insert into dept values(01,'aa');

BALLONTT@PROD> insert into dept values(02,'bb');

BALLONTT@PROD> insert into dept values(0