Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Update(Subquery with Order by ); Deadlock  [new]
muma1
Member

Откуда:
Сообщений: 33
"ORDER BY" игнорируется?

Oracle Database 11g Release 11.2.0.3.0 - 64bit Production (Standart)

Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-000b0013-000e505f        68     844     X             63     635           X
TX-0012001a-00008419        63     635     X             68     844           X

  current SQL:
  UPDATE 
(SELECT CBP_GUEST_START, CBP_GUEST_STATE FROM CHAT_BILL_PARTS WHERE CBP_DATAID = :B1 AND CBP_GUEST_STATE < 4000 ORDER BY CBP_ID DESC) 
SET CBP_GUEST_START = NVL (CBP_GUEST_START, SYSDATE), CBP_GUEST_STATE = 2000

Information for THIS session:
----- Current SQL Statement for this session (sql_id=7x7wwkbwdbk1k) -----
UPDATE 
( SELECT CBP_HOST_START, CBP_HOST_STATE FROM CHAT_BILL_PARTS WHERE CBP_DATAID IN (SELECT COLUMN_VALUE FROM TABLE (:B1 )) AND CBP_HOST_STATE < 4000 ORDER BY CBP_ID DESC) 
SET CBP_HOST_START = NVL (CBP_HOST_START, SYSDATE), CBP_HOST_STATE = 2000
7 сен 12, 17:40    [13131827]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
muma1,

а в чём вопрос?
сортировка ваша во вложенном подзапросе. материализации её результата нет.
следовательно, сервер вам ничем не обязан и ничего не должен. (а в былых версиях мог и зарубить на компиляции)
7 сен 12, 17:46    [13131877]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
muma1
Member

Откуда:
Сообщений: 33
orawish,
Спасибо, просветили. Без "declare cursor" не получится.
7 сен 12, 17:54    [13131953]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
muma1
orawish,
Спасибо, просветили. Без "declare cursor" не получится.
select for update order by?
7 сен 12, 21:42    [13132760]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
CBP_ID - уникально / not null ? Покажи реальные планы выполнения обоих апдейтов.
8 сен 12, 00:44    [13133259]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
muma1,

а триггеров-то нет или других апдейтов до этого?
8 сен 12, 04:27    [13133388]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
muma1
Member

Откуда:
Сообщений: 33
_Nikotin
CBP_ID - уникально / not null ? Покажи реальные планы выполнения обоих апдейтов.

да, уникально / not null.
xtender
а триггеров-то нет или других апдейтов до этого?

Нет. причина Deadlock классическая: Первая сессия в цикле обновляет по одной записи из некоей неотсортированной коллекции.
Нужно было просто взглянуть на код шире.
а вот игнорируется ли "ORDER BY" в
UPDATE 
(SELECT CBP_GUEST_START, CBP_GUEST_STATE FROM CHAT_BILL_PARTS WHERE CBP_DATAID = :B1 AND CBP_GUEST_STATE < 4000 ORDER BY CBP_ID DESC) 
SET CBP_GUEST_START = NVL (CBP_GUEST_START, SYSDATE), CBP_GUEST_STATE = 2000

, я попрежнему в сомнениях, ведь на момент UPDATE выборка завершена.
10 сен 12, 13:25    [13139873]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
muma1,

Где планы?
10 сен 12, 14:07    [13140181]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
stax..
Guest
orawish
muma1,

а в чём вопрос?
сортировка ваша во вложенном подзапросе. материализации её результата нет.
следовательно, сервер вам ничем не обязан и ничего не должен. (а в былых версиях мог и зарубить на компиляции)

почему не обязан?
причем тут материализация, order by есть будь добр отсортируй
імхо, бага

.....
stax
10 сен 12, 14:44    [13140516]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
stax..
Guest
xtender
muma1,

Где планы?

повторить наверное достаточно сложно

у меня такое было в семерке, ни с того ни с сего получал деадлок причем очень редко
админ тож сначала не верил, повторить не получалось, блого ему в лог пишет
но тогда нельзя было update (.... order by ...) set


.....
stax
10 сен 12, 14:50    [13140569]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
-2-
Member

Откуда:
Сообщений: 15330
muma1,

может битмап индекс?
10 сен 12, 15:06    [13140686]     Ответить | Цитировать Сообщить модератору
 Re: Update(Subquery with Order by ); Deadlock  [new]
muma1
Member

Откуда:
Сообщений: 33
-2-
muma1, может битмап индекс?
В "Standart Edition" - нет битмап.

orawish
а в чём вопрос?
сортировка ваша во вложенном подзапросе. материализации её результата нет.
следовательно, сервер вам ничем не обязан и ничего не должен. (а в былых версиях мог и зарубить на компиляции)

в том был вопрос: раз не зарубил, то должен ли исполнять, ведь мы не ограничиваемся каким-то "rowid"

Может кому интересно:
1. Deadlock разрешился. Первый запрос обновлял в цикле по одной записи из коллекции, где сортировка была не по CBP_ID.
2. В первом запросе ORDER BY CBP_ID игнорируется, т.к. CBP_DATAID уникальный.
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 28 | 3 (0)| 00:00:01 |
| 1 | UPDATE | CHAT_BILL_PARTS | | | | |
|* 2 | INDEX RANGE SCAN| CHAT_BILL_PARTS_IDX_DATAID | 1 | 28 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Во втором ORDER BY CBP_ID не(!) игнорируется, так как в теории мы имеем несколько записей.
------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 37 | 3 (0)| 00:00:01 |
| 1 | UPDATE | CHAT_BILL_PARTS | | | | |
| 2 | SORT ORDER BY | | 1 | 37 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS BY INDEX ROWID| CHAT_BILL_PARTS | 1 | 37 | 3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | CHAT_BILL_PARTS_IDX_DATAID | 1 | | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------
Всем спасибо.
10 сен 12, 16:01    [13141096]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить