因此,我们被告知,TM Enq
争用的一种来源可能是未编入索引的 FK。我的问题是哪一个。
我有一个INSERT INTO Table_B
正在录音的TM Enq Wait
。
它包含作为PK
其他表的父级的 a ,并且它具有FK
限制为其他PK
s 的列。
那么哪些FK
需要索引:该表的列还是它的子表?
注意:我知道这不是 TM 争用的唯一原因。如果是这样的话,你能解释一下为什么不可能是这样吗?
因此,我们被告知,TM Enq
争用的一种来源可能是未编入索引的 FK。我的问题是哪一个。
我有一个INSERT INTO Table_B
正在录音的TM Enq Wait
。
它包含作为PK
其他表的父级的 a ,并且它具有FK
限制为其他PK
s 的列。
那么哪些FK
需要索引:该表的列还是它的子表?
注意:我知道这不是 TM 争用的唯一原因。如果是这样的话,你能解释一下为什么不可能是这样吗?
不确定 Oracle TM 争用,但我会说通常外键关系的双方都被索引。否则,数据库将不得不进行表扫描。
两边的索引也给数据库一个很好的机会进行快速(索引)连接,不管它的优化器更喜欢来自哪一边。
编辑:在谷歌上搜索过 TM 争用,听起来你可能错过了子记录上的键。但请确保它们在两侧都有,真的。
编辑2:回答评论,
如果您有一个 OLTP 表,它有 13 个 FK 来查找表,那么除了表、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/,如果您完全更改父表,您几乎需要拥有索引。显然,除非您有索引,否则您可以通过同时更改父表和子表来获得它们。所以这可能就是您所看到的(假设您没有做明显的事情,例如更新引用的列或删除行)
启用的外键关系的父(引用)列必须被索引,因为它必须具有启用的唯一键或主键约束。
你看到的是什么模式的 TM Enqueue?