Unshared cursors / High version_counts

Симптомы

Wait events – cursor: pin S wait on X, library cache pin, latch: shared pool
Низкий процент «Execute to Parse %», высокий процент «Recursive Call %» в отчётах Statspack/AWR

Документ поддержки296377.1 Handling and resolving unshared cursors/large version_counts.
Обзор V$SQL_SHARED_CURSOR предназначен для идентификации причин проблемы. Запрос для оценки количества версий запросов и причин появления неразделяемых курсоров в shared pool можно найти на сайте Burleson Consulting.

Некоторые причины

ROLL_INVALID_MISMATCH
«Marked for rolling invalidation and invalidation window exceeded» – инвалидация курсора при изменении статистики объектов. Зависит, в частности, от значения параметра NO_INVALIDATE пакета DBMS_STATS – 557661.1 Rolling Cursor Invalidations with DBMS_STATS in Oracle10g Version: 10.1.0.0 to 11.1.

Случай, если вышеуказанный запрос ничего не говорит о причинах «high version counts» (возвращает NULL в поле REASON), вероятнее всего относится к проблеме 377847.1 Unsafe Peeked Bind Variables and Histograms.

ORA-00060 DEADLOCK DETECTED

62354.1 TX Transaction locks – Example wait scenarios
62365.1 What to do with «ORA-60 Deadlock Detected» Errors

Подробный анализ различных сценариев возникновения ошибки с примерами разбора DEADLOCK-графа из трейс файла и рекомендациями: Mark Bobak Understanding and Interpreting Deadlocks. Presented at Hotsos 2006:

Scenario #1 – TM enqueue. Как правило, неиндескированые Foreign key столбцы, найти можно с помощью запроса от T.Kyte.
Scenario #2 – TX Enqueue, ‘X’ mode held, ‘X’ mode waiting. Блокировка на уровне строк (row-level lock). Чаще всего является «особенностью» дизайна приложения.

Это те 2 классических сценария deadlock, о которых в трейс-файлах Oracle написано: «The following deadlock is not an ORACLE error. It is a deadlock due to user error in the design of an application or from issuing incorrect ad-hoc SQL.«

Scenario #3 – TX Enqueue, ‘X’ mode held, ‘S’ mode waiting
1) ITL slot contention.  (Not possible if statement is an INSERT and table is not an IOT). Причиной проблемы является конкуренция за место для записи о транзакции (transacion entry) в Interested Transaction List (ITL) заголовка блока данных таблицы или индекса Oracle. Указанная конкуренция, согласно утверждению автора, невозможна для операций вставки в не-IOT таблицы.  Проблема решается измением параметров хранения объектов (INITRANS, PCTFREE). Начиная с Oracle 10g идентифицируется отдельным событием ожидания «enq: TX – allocate ITL entry» и отдельной статистикой сегментов (STATISTIC_NAME=»ITL Waits» в обзоре V$SEGMENT_STATISTICS).
2) Bitmap index fragment overlap.  (Not possible if no bitmap exists on the table). Проблема использования bitmap индексов в OLTP системах.
3) Primary key, unique key, or IOT row values overlapping on insert. Случай взаимоожидания проверки ограничений целостности при вставке.

Обсуждение частных случаев, включая сценарий #3 и self-deadlock при использовании pragma autonomous_transaction можно найти на сайте AskTom INITRANS Cause of deadlock.

В кластерном окружении Oracle RAC диагностика deadlock не так отработана, вместо ORA-60 можно получить ошибки вида Global Enqueue Services Deadlock detected. More info in file /u01/app/oracle/admin/dbname/bdump/inst1_lmd0.trc с трейсом в файле bdump/inst1_lmd0.trc .

Подробное описание диагностики глобальных блокировок от Oracle 262226.1 Deadlock Error Not in Alert.log and No Trace File Generated on OPS or RAC, включая описание Global Wait-For-Graph(WFG).

Обсуждения специалистов: RAC internals – GLOBAL ENQUEUE SERVICES DEADLOCK DETECTED, How to analyze global deadlocks ?.

0 Ответы в “Типичные проблемы”



  1. No Comments Yet

Ответить