Oracle mechanics

19.06.2015

Короткие ожидания enq: TX — row lock contention в запросах FOR UPDATE SKIP LOCKED

Filed under: Oracle — Игорь Усольцев @ 00:27
Tags: ,

Пример использования блокировок на уровне строки наблюдали с Дмитрием Балабановым для запросов этого типа:

11.2.0.3.@ SQL> @ash_sql_wait_tree "event = 'enq: TX - row lock contention' and sql_id in (select sql_id from gv$sqlarea where upper(sql_fulltext) like '%FOR%UPDATE%SKIP%LOCKED%' and command_type = 3)"


LVL  INST_ID BLOCKING_TREE  EVENT                          WAITS_COUNT  EXECS_COUNT  AVG_WAIT_TIME_MS DATA_OBJECT               BLOCK_SID       SQL_ID        SQL_PLAN_LINE_ID SQL_PLAN_OPERATION SQL_TEXT
--- -------- -------------- ----------------------------- ------------ ------------ ----------------- ------------------------- --------------- ------------- ---------------- ------------------ ----------------------------------------
  1        2 (USER)         enq: TX - row lock contention         1766         1764                 0 MY.AQ_TABLE.              GLOBAL i#       5cbp4s5jq04xg                1 FOR UPDATE         select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */
  1        1 (USER)         enq: TX - row lock contention         1163         1162                 0 MY.AQ_TABLE.              GLOBAL i#       5cbp4s5jq04xg                1 FOR UPDATE         select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */
  1        2 (USER)         enq: TX - row lock contention          304          304                 0 MY.U_TAABLE.U_PARTITION   GLOBAL i#       8x5xmcz928ydq                1 FOR UPDATE         SELECT                                   -- *
  1        1 (USER)         enq: TX - row lock contention          288          288                 0 MY.U_TAABLE.U_PARTITION   GLOBAL i#       8x5xmcz928ydq                1 FOR UPDATE         SELECT                                   -- *
  1        2 (USER)         enq: TX - row lock contention           29           29                 0 MY.AQ_TABLE.              UNKNOWN i#      5cbp4s5jq04xg                1 FOR UPDATE         select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */
  1        1 (USER)         enq: TX - row lock contention           11           11                 0 MY.AQ_TABLE.              UNKNOWN i#      5cbp4s5jq04xg                1 FOR UPDATE         select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */
  1        1 (USER)         enq: TX - row lock contention            7            7                 0 MY.U_TAABLE.OEBS          GLOBAL i#       fkrrfw2jmg1jw                1 FOR UPDATE         SELECT                                   -- *
  1        1 (USER)         enq: TX - row lock contention            7            7                 0 MY.U_TAABLE.U_PARTITION2  GLOBAL i#       8x5xmcz928ydq                1 FOR UPDATE         SELECT                                   -- *
  1        2 (USER)         enq: TX - row lock contention            3            3                 0 MY.AQ_TABLE.              VALID i#1       5cbp4s5jq04xg                1 FOR UPDATE         select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */
  1        2 (USER)         enq: TX - row lock contention            3            3                 0 MY.U_TAABLE.U_PARTITION2  GLOBAL i#       8x5xmcz928ydq                1 FOR UPDATE         SELECT                                   -- *
  1        1 (USER)         enq: TX - row lock contention            2            2                 0 MY.AQ_TABLE.              VALID i#2       5cbp4s5jq04xg                1 FOR UPDATE         select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */
  1        1 (USER)         enq: TX - row lock contention            1            1                 0 MY.U_LOCKS_TABLE.         GLOBAL i#       5c4mptv666r2x                1 FOR UPDATE         SELECT ID FROM U_LOCKS_TABLE WHERE NAME  -- *
  2        1   (USER)       On CPU / runqueue                        1            1                 0 ..                        NOT IN WAIT i#  5cbp4s5jq04xg                3 INDEX RANGE SCAN   select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */ -- **
  2        1   (USER)       On CPU / runqueue                        1            1                 0 MY.AQ$_AQ_TABLE_I.        NOT IN WAIT i#  5cbp4s5jq04xg                3 INDEX RANGE SCAN   select  /*+ INDEX(TAB AQ$_AQ_TABLE_I) */ -- **

— т.е. to skip any rows that are found to be already locked by another transaction, в ASH фиксируются формальные блокировки с 0-й длительностью AVG_WAIT_TIME_MS, вычисляемой как AVG(TIME_WAITED) / 1000

Среди запросов с использованием SKIP LOCKED, вролне естественно, много AQ-запросов, есть пользовательские запросы (*) и даже отмечена пара AQ-блокеров (**)

3 комментария »

  1. Добрый день Игорь!

    Уже было обрадовался, увидев, что обновленная версия скрипта ash_sql_wait_tree выдает имена объектов,
    но тут-же расстроился, его нет в коллекции, также, как и sqlpatch+ .
    Можете опубликовать?

    С уважением,
    Сергей

    комментарий от Sergey — 22.06.2015 @ 22:38 | Ответить

  2. Огромное спасибо, очень помогли!

    комментарий от Sergey — 23.06.2015 @ 20:59 | Ответить


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: