关于外键列上的索引

| 1 Comment

yangtingkun在"外键列上是否需要索引"这篇文章里介绍了在外键列上建索引的必要性,这篇文章里有提到:

这时会话被锁住,因为缺少了外键索引后,主表删除或更新记录会导致子表整个表被锁,而这会导致严重的系统并发问题。

 

这里怎样理解"主表删除或更新记录会导致子表整个表被锁"?

在这篇文章里,我们深入剖析了上述问题,并且得出了如下结论:

1、  在子表外键列上没有索引的情况下,主表删除或更新记录是否锁子表(lock the entire table in shared mode)跟子表上是否有mode3TM enqueue有关;锁子表的本质原因是因为oracle这里想对子表上的TM enqueueconvert

2、  在子表外键列上有索引的情况下,主表删除或更新记录不会锁子表(lock the entire table in shared mode),不锁子表的本质原因是因为这时oracle就不对子表上的TM enqueueconvert了;

3、  alter table XXX disable table lock不能对子表做,否则主表就不能删除或者更新记录了。

4、  alter table XXX disable table lock并不能够解决在子表外键列上无索引情况下的并发问题。这个跟DSI405里描述的并不一致(405里说用了alter table XXX disable table lock后就可以不用在外键列上建索引了)

 

详细内容请参见附带的word文档:

关于外键列上的索引.doc

 

1 Comment

Leave a comment