所以我们被告知TM Enq
争用的一个来源可以是未编入索引的FK。我的问题是哪一个。
我有INSERT INTO Table_B
正在录制TM Enq Wait
。
它包含PK
,它是其他表的父级,并且其列FK
约束到其他PK
。
那么FK
需要索引哪个:该表的列或其子项?
注意:我知道这不是TM争用的唯一原因。如果情况确实如此,你能解释为什么不可能这样吗。
答案 0 :(得分:2)
不确定Oracle TM争用,但我通常会说外键关系的双方都被编入索引。否则,数据库将不得不进行表扫描。
双方的索引也为数据库提供了快速(索引)连接的良好机会,无论优化者喜欢哪一方都来自。
编辑:谷歌搜索TM争用,听起来你可能错过了儿童记录上的密钥。但是一定要确保两边都有它们。编辑2:回复评论,
如果你有一个OLTP表有13个FK来查找表,我不是 除了table,pk和其他任何内容之外,还热衷于13个索引更新 索引。索引很重要,但出于特定原因。如果你没有 更新父PK也不从父进程中删除,子索引是 没那么有用。或者是吗?
取决于您正在运行的联接和查询,然后。例如,如果你跑 像这样的查询:
SELECT o.something
FROM oltp_tab o JOIN lookup l ON (o.lookup_no = l.lookup_no)
WHERE l.lookup_name = ?
然后查询优化器可能会喜欢子项上的索引 记录。
另外,根据http://ashmasters.com/waits/enq-tm-contention/你的意见 如果更改父表,则非常需要索引 所有。显然,你可以让他们同时进行更改 父表和子表,除非你有索引。所以这可能是 你所看到的(假设你没有做明显的事情,比如 更新引用列或删除行)
答案 1 :(得分:1)
必须为启用的外键关系的父(引用)列编制索引,因为它必须具有已启用的唯一键或主键约束。
您看到的TM Enqueue是什么模式?