Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Wolf Larsen
Member

Откуда: Москва
Сообщений: 90
SELECT *
  FROM таблица
 WHERE таблица.RECORD_ID IN 

(

SELECT таблица.RECORD_ID
FROM таблица
WHERE таблица.USER_NAME = USER
      AND другие условия
)

AND ROWNUM = 1
FOR UPDATE

В 10ке отрабатывал нормально и не пытался блокирова всю таблицу. В 11ой-же начались глюки, когда условие
WHERE таблица.USER_NAME = USER
начинает превышать некоторое количество записей, запрос пытается блокирнуть всю таблицу сразу (а там под милион записей)

Вот такая переделка запроса - решила проблему.

SELECT *
  FROM таблица
 WHERE таблица.RECORD_ID = 

(

SELECT таблица.RECORD_ID
FROM таблица
WHERE таблица.USER_NAME = USER
      AND другие условия

     AND ROWNUM = 1

)

FOR UPDATE

При этом план запросов одинаков в обоих случаях. Видимо я плохо понимаю что такое ROWNUM...
Хотел спросить что-же это за зверь такой в данном случае.
23 сен 08, 12:46    [6216839]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Wolf Larsen
В 10ке отрабатывал нормально и не пытался блокирова всю таблицу. В 11ой-же начались глюки, когда условие
WHERE таблица.USER_NAME = USER
начинает превышать некоторое количество записей, запрос пытается блокирнуть всю таблицу сразу (а там под милион записей)

При этом план запросов одинаков в обоих случаях. Видимо я плохо понимаю что такое ROWNUM...
Хотел спросить что-же это за зверь такой в данном случае.
Как определили, что "запрос пытается блокирнуть всю таблицу"?

Oracle® Database
SQL Reference
10g Release 2 (10.2)
и
Oracle® Database
SQL Language Reference
11g Release 1 (11.1)
For each row returned by a query, the ROWNUM pseudocolumn returns a number
indicating the order in which Oracle selects the row from a table or set of joined rows.
The first row selected has a ROWNUM of 1, the second has 2, and so on.
23 сен 08, 14:10    [6217418]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Wolf Larsen
Member

Откуда: Москва
Сообщений: 90
1. В системных вьюхах показывается что идет блокировка таблицы такой-то...
2.На отладочной базе где нет пользователей. Делаю UPDATE нескольких записей в таблице не попадающих ну никак ни по какому индексу в область поиска из того запроса и пока не закрою транзакцию - FOR UPDATE будет висеть.

Ошибаюсь?

Ну и по описанию что такое ROWNUM получается что операнд FOR UPDATE почему-то стал отрабатывать до условия ROWNUM = 1
23 сен 08, 14:44    [6217709]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
по-моему это разные запросы и по идее могут вернуть разный результат
23 сен 08, 16:35    [6218623]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Тифа
Guest
SergSuper
по-моему это разные запросы и по идее могут вернуть разный результат

помоему оба запроса могут возвращать в разное время разные результаты, орера то нету, наверно на логику это не влияет
23 сен 08, 17:04    [6218814]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Elic
Member

Откуда:
Сообщений: 29980
SergSuper
по-моему это разные запросы и по идее могут вернуть разный результат
В "разной степени случайности" на фоне "случайности" совершенно меркнет её "разная степень" :)
23 сен 08, 17:17    [6218898]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
Elic
SergSuper
по-моему это разные запросы и по идее могут вернуть разный результат
В "разной степени случайности" на фоне "случайности" совершенно меркнет её "разная степень" :)

Elic, как он может заблокировать больше одной строки при
AND ROWNUM = 1
FOR UPDATE

если нет какой-то екзотики (аля битмапа) то имхо баг

мож из-за PK-FK начала 11-ка блокировать

мож попробовать перед фор упдате alter table t DISABLE TABLE LOCK;

.....
stax
23 сен 08, 19:42    [6219533]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
1
Guest
Ну нет в реляционной алгебре понятия "номер строки" Не -ту! rownum - изыски диалекта. Поэтому сам сервер не знает что такое строка с rownum=1 . Отсюда и лок на всю таблу - вы же сами сказали - select for update. Я не знаю как там в девятке и ли ниже - но так -то - все логично!
23 сен 08, 19:59    [6219569]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
1
Ну нет в реляционной алгебре понятия "номер строки" Не -ту! rownum - изыски диалекта. Поэтому сам сервер не знает что такое строка с rownum=1 . Отсюда и лок на всю таблу - вы же сами сказали - select for update. Я не знаю как там в девятке и ли ниже - но так -то - все логично!

как ето не логично
for update должен блокировать те строки которые попадают под условие запроса
счас попробую на апексе
.....
stax
23 сен 08, 20:21    [6219590]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Жареный петух
Guest
1
Поэтому сам сервер не знает что такое строка с rownum=1 .


Опть, еще один специялист выскочил.
Голова думать - сил нет ?
23 сен 08, 20:32    [6219608]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
апекс не блокирует
на простых запрсах
SELECT *
  FROM t
 WHERE t.RECORD_ID IN 
(
SELECT RECORD_ID
FROM t
WHERE USER_NAME  = 't'
      AND d=1
)
AND ROWNUM = 1
FOR UPDATE
"начинает превышать некоторое количество записей"
ето сколько?
......
stax
23 сен 08, 20:38    [6219616]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Амаразм
Member

Откуда:
Сообщений: 299
"Oracle блокирует данные на уровне строк и только при изменении. Эскалация блокировок до уровня блока или таблицы никогда не выполняется." (с) Том Кайт.

Это касалось 9ой версии, вряд ли в 11ой версии это изменилось.
24 сен 08, 16:28    [6223764]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
Амаразм
"Oracle блокирует данные на уровне строк и только при изменении. Эскалация блокировок до уровня блока или таблицы никогда не выполняется." (с) Том Кайт.

Это касалось 9ой версии, вряд ли в 11ой версии это изменилось.

ето Том погорячился, напр

1) с битмап индексами (блокировки могут быть и не на уровне строк)
2) в екзотических случаях из-за неиндексированных FK
3) другое

но вот что из=за ROWNUM<2 верится с трудом (вернее не верится)
и хотелось бы тест провернуть

.....
stax
24 сен 08, 17:27    [6224310]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Амаразм
"Oracle блокирует данные на уровне строк и только при изменении. Эскалация блокировок до уровня блока или таблицы никогда не выполняется." (с) Том Кайт.

Это касалось 9ой версии, вряд ли в 11ой версии это изменилось.


только при изменении or on SELECT FOR UPDATE. Also, there was a "изменилось" since 9ой версии - Bug 4969880 - Allow the fix for bug 3646162 to be disabled.
Anyway, I'd like to see Wolf Larsen's test showing table level lock in 11g.

SY.

Сообщение было отредактировано: 24 сен 08, 17:38
24 сен 08, 17:38    [6224381]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
доигрался!!!

лог сесии
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production

SQL> create table tt(id int);

Table created.

SQL> alter table tt disable table lock;

Table altered.

SQL> alter table tt enable  table lock;
alter table tt enable  table lock
*
ERROR at line 1:
ORA-00054: указан занятый ресурс и его получение с опцией NOWAIT

SQL> select * from dba_objects where object_name='TT';

OWNER                          OBJECT_NAME     SUBOBJECT_NAME                 OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE        CREATED  LAST_DDL TIMESTAMP           STATUS  T G S
------------------------------ --------------- ------------------------------ --------- -------------- ------------------ -------- -------- ------------------- ------- - - -
STAX                           TT                                                 33854          33854 TABLE              26.09.08 26.09.08 2008-09-26:15:02:26 VALID   N N N

SQL> 

может у кого-то было, и есть время и охота подскажите,
а то теперь сам не могу найти кто-ж занял ресурс
зы
таких таблиц уже две
.....
stax
26 сен 08, 16:28    [6234112]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
вопрос снимается, нашел
.....
stax
26 сен 08, 16:32    [6234131]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
Elic
Member

Откуда:
Сообщений: 29980
stax..
доигрался!!!
Disable/Enable DDL table locks and performance
26 сен 08, 16:35    [6234153]     Ответить | Цитировать Сообщить модератору
 Re: Странный эффект с ROWNUM и FOR UPDATE при переходе с 10 на 11  [new]
stax..
Guest
Elic
stax..
доигрался!!!
Disable/Enable DDL table locks and performance

Елик, огромное спасибо
я не знал о буге
никак не мог понять почему ждут
тоесть я и счас не очень то понимаю,
но главное что нашел кого ждет
.....
stax
26 сен 08, 16:40    [6234186]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить