未编制索引的外键导致TM Enqueue争用

时间:2008-12-08 23:58:50

标签: oracle indexing foreign-keys contention

所以我们被告知TM Enq争用的一个来源可以是未编入索引的FK。我的问题是哪一个。

我有INSERT INTO Table_B正在录制TM Enq Wait

它包含PK,它是其他表的父级,并且其列FK约束到其他PK

那么FK需要索引哪个:该表的列或其子项?

注意:我知道这不是TM争用的唯一原因。如果情况确实如此,你能解释为什么不可能这样吗。

2 个答案:

答案 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是什么模式?