Идентификация и разрешение Oracle мертвая блокировка ITL

У меня есть пакет DB Oracle, который обычно вызывает то, чему я верю, 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

На этой таблице нет никаких растровых индексов, таким образом, это не причина. Насколько я могу сказать, отсутствие "Rows, которого ожидают на" плюс "S" в Официанте, ожидает, столбец, вероятно, указывает, что это - мертвая блокировка ITL. Кроме того, таблица записана в довольно часто (примерно 8 вставляют или обновления одновременно, так же часто как 240 раз в минуту), таким образом, мертвая блокировка ITL походит на большую вероятность.

Я увеличил параметр INITRANS таблицы, и это - индексы к 100 и увеличилось, PCT_FREE на таблице от 10 до 20 (затем восстановил индексы), но мертвые блокировки все еще происходят. Мертвая блокировка, кажется, происходит чаще всего во время обновления, но это могло просто быть совпадением, поскольку я только проследил ее пару раз.

Мои вопросы являются двукратными:
1) Это - на самом деле мертвая блокировка ITL?
2) Если это - мертвая блокировка ITL, что еще может быть сделано для предотвращения его?


Оказывается, что это не было проблемой мертвой блокировки ITL вообще, а скорее проблемой с неиндексируемыми внешними ключами. Я обнаружил это благодаря ответу dpbradley, который хорошо осведомленный меня в то, что это не было проблемой ITL и предложило мне узнавать, каковы другие причины мертвой блокировки с "никакими строками" могли бы быть.

6
задан Allan 25 February 2015 в 14:00
поделиться

1 ответ

Лучшим показателем давления ITL являются представления производительности:

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

показывает TX contention waits, и

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 не является проблемой, тогда необходимо изучить код приложения.

5
ответ дан 17 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: