关于外键索引的问题!

[复制链接]
查看11 | 回复8 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
在ORACLE 9I ocp书中:
--Implementation of referential integriry constraint has changed.
-- No index is required on the foreign key column in the child table.
请问大家到底在什么情况下要对外键建立索引?是在oralcle 9i 之前的表要建立外键索引,对9i 以后的就不要了?
清大家指点?
谢谢!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
索引其实不止是为了检索用的,而且还要维护一致性forigen key index就是这样的,对父表主键做操作的时候如果子表外键没索引那么就会在子表上加一个共享锁,这样对子表DML就出现阻塞,老版本其实看v$lock就看到了,9以后有大改变了,不过最好还是加索引
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
能具体说一下9i以后的操作吗?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
Full table scan if no index .....
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
9以前对PK做update或者delete的时候如果外键没有索引,那对子表的共享锁的期间是事务的期间,9以后应该是执行命令的期间,所以最好还是有索引,其实对比看看TM类的enqueue stat就知道了
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
学习!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
谁做过实验的成功的。贴上来看看!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
Oracle中更新主外键时的一些注意事项
http://winkexp.itpub.net/post/3154/14538
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
楼上的试验很能说明问题, 应用正好有这方面的问题, 学习了.
Tom的一段sql, 作用是找出没有建立索引的外键, 太复杂, 我是没有看懂


[PHP]COLUMN COLUMNS format a30 word_wrapped
COLUMN tablename format a15 word_wrapped
COLUMN constraint_name format a15 word_wrapped
SELECT TABLE_NAME,
CONSTRAINT_NAME,
CNAME1 || NVL2(CNAME2, ',' || CNAME2, NULL) ||
NVL2(CNAME3, ',' || CNAME3, NULL) ||
NVL2(CNAME4, ',' || CNAME4, NULL) ||
NVL2(CNAME5, ',' || CNAME5, NULL) ||
NVL2(CNAME6, ',' || CNAME6, NULL) ||
NVL2(CNAME7, ',' || CNAME7, NULL) ||
NVL2(CNAME8, ',' || CNAME8, NULL) COLUMNS
FROM (SELECT B.TABLE_NAME,

B.CONSTRAINT_NAME,

MAX(DECODE(POSITION, 1, COLUMN_NAME, NULL)) CNAME1,

MAX(DECODE(POSITION, 2, COLUMN_NAME, NULL)) CNAME2,

MAX(DECODE(POSITION, 3, COLUMN_NAME, NULL)) CNAME3,

MAX(DECODE(POSITION, 4, COLUMN_NAME, NULL)) CNAME4,

MAX(DECODE(POSITION, 5, COLUMN_NAME, NULL)) CNAME5,

MAX(DECODE(POSITION, 6, COLUMN_NAME, NULL)) CNAME6,

MAX(DECODE(POSITION, 7, COLUMN_NAME, NULL)) CNAME7,

MAX(DECODE(POSITION, 8, COLUMN_NAME, NULL)) CNAME8,

COUNT(*) COL_CNT

FROM (SELECT SUBSTR(TABLE_NAME, 1, 30) TABLE_NAME,

SUBSTR(CONSTRAINT_NAME, 1, 30) CONSTRAINT_NAME,

SUBSTR(COLUMN_NAME, 1, 30) COLUMN_NAME,

POSITION

FROM USER_CONS_COLUMNS) A,

USER_CONSTRAINTS B
WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
AND B.CONSTRAINT_TYPE = 'R'
GROUP BY B.TABLE_NAME, B.CONSTRAINT_NAME) CONS
WHERE COL_CNT > ALL
(SELECT COUNT(*)

FROM USER_IND_COLUMNS I
WHERE I.TABLE_NAME = CONS.TABLE_NAME
AND I.COLUMN_NAME IN (CNAME1, CNAME2, CNAME3, CNAME4, CNAME5,

CNAME6, CNAME7, CNAME8)
AND I.COLUMN_POSITIONALL
(SELECT COUNT(*)

FROM USER_IND_COLUMNS I
WHERE I.TABLE_NAME = CONS.TABLE_NAME
AND I.COLUMN_NAME IN (CNAME1, CNAME2, CNAME3, CNAME4, CNAME5,

CNAME6, CNAME7, CNAME8)
AND I.COLUMN_POSITION <= CONS.COL_CNT
GROUP BY I.INDEX_NAME)
/[/PHP]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行