6

我有一个 Oracle DB 包,它经常导致我认为是 ITL(感兴趣的事务列表)死锁。跟踪文件的相关部分如下。

Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TM-0000cb52-00000000        22     131           S       23     143          SS
TM-0000ceec-00000000        23     143    SX             32     138    SX   SSX
TM-0000cb52-00000000        30     138    SX             22     131           S
session 131: DID 0001-0016-00000D1C session 143: DID 0001-0017-000055D5
session 143: DID 0001-0017-000055D5 session 138: DID 0001-001E-000067A0
session 138: DID 0001-001E-000067A0 session 131: DID 0001-0016-00000D1C
Rows waited on:
Session 143: no row
Session 138: no row
Session 131: no row

此表上没有位图索引,所以这不是原因。据我所知,缺少“等待的行”加上等待列中的“S”可能表明这是一个 ITL 死锁。此外,该表的写入频率很高(大约同时插入或更新 8 次,每分钟最多 240 次),因此 ITL 死锁似乎很有可能。

我已将表的 INITRANS 参数及其索引增加到 100,并将表上的 PCT_FREE 从 10 增加到 20(然后重建索引),但死锁仍在发生。死锁似乎最常发生在更新期间,但这可能只是巧合,因为我只追踪了几次。

我的问题有两个:
1)这实际上是一个 ITL 死锁吗?
2)如果是ITL死锁,还有什么办法可以避免呢?


事实证明,这根本不是 ITL 死锁问题,而是未索引外键的问题。由于 dpbradley 的回答,我发现了这一点,这让我知道这不是 ITL 问题,并促使我找出“无行”死锁的其他原因可能是什么。

4

2 回答 2

5

ITL 压力的最佳指示来自性能视图:

select event, total_waits, time_waited, average_wait
 from v$system_event
 where event like 'enq: TX%'
 order by 2 desc;

显示 TX 争用等待,并且

select OBJECT_NAME, SUBOBJECT_NAME, TABLESPACE_NAME, 
       OBJECT_TYPE, STATISTIC_NAME, VALUE
  from v$segment_statistics 
  where statistic_name = 'ITL waits'
  and value > 0
  order by value desc;

显示所涉及的表和索引。

(与所有v$视图一样,结果来自实例启动的时间点。)

如果这表明您确实有 ITL 等待,那么 INITRANS 和 PCTFREE 参数是要转动的主要旋钮(但 INITRANS = 100 对我来说听起来相当高,而且这些会占用空间)。

如果 ITL 等待不是问题,则需要检查应用程序代码。

于 2010-05-25T13:58:48.470 回答
2

最好的选择是根据需要增加它(从默认的 10 开始并增加 10)。如果您看到 ITL 等待时间减少,那么您已经准备就绪。通常这些相关参数在 Oracle 和 SQL Server 中都是通过反复试验来调整的。除非资源非常繁忙,否则实时调整这些参数并不是什么大问题。您可以使用以下查询在每次增量后查看 ITL 是否等待消失或大幅减少:

SELECT t.OWNER, t.OBJECT_NAME, t.OBJECT_TYPE, t.STATISTIC_NAME, t.VALUE
  FROM v$segment_statistics t
  WHERE t.STATISTIC_NAME = 'ITL waits' AND t.VALUE > 0
  ORDER BY t.value desc;

由于 ITL 等待,我们使用这种方法对 Oracle 死锁场景进行了多次调整。注意:如果为索引修改了 initrans,请确保重建索引。还要确保统计数据不会过时。

为了快速检查,可以使用 SQL Tuning Advisor 来查看查询/索引和统计信息的完整状态。

于 2013-05-28T23:51:37.207 回答