Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Результат count( F1 )over() в процессе update set F1=null: cursor stability ? / 16 сообщений из 16, страница 1 из 1
31.12.2013, 13:35:40
    #38516514
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
hi all

DDL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
recreate table t(x int, y int); 
commit;
insert into t values(1, 1);
insert into t values(2, 2);
insert into t values(3, 3);
insert into t values(4, 4);
insert into t values(5, 5);
commit;

DML:
Код: sql
1.
2.
update t set x=null, y=(select c from (select count(x)over() c from t) rows 1);
select * from t; 

Result:
Код: plaintext
1.
2.
3.
4.
5.
6.
      X            Y
======= ============
 <null>            5
 <null>            4
 <null>            3
 <null>            2
 <null>            1

PS-1. в Oracle :
Код: sql
1.
2.
3.
set null '<null>'
update t set x=null, y=( select c from (select count(x)over() c from t) where rownum=1 );
select * from t;

Код: plaintext
1.
2.
3.
4.
5.
6.
         X          Y
---------- ----------
<null>              5
<null>              5
<null>              5
<null>              5
<null>              5

PS-2. в m$ sql :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table t(x int, y int)
go
insert into t values(1,1)
insert into t values(2,2)
insert into t values(3,3)
insert into t values(4,4)
insert into t values(5,5)
go

update t set x=null, y=( select top 1 c from (select count(x)over() c from t) t );
select * from t


xyNULL5NULL5NULL5NULL5NULL5

Any comments ?
...
Рейтинг: 0 / 0
31.12.2013, 13:49:42
    #38516519
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
А вот если так его:
Код: sql
1.
insert into t(x, y) select row_number()over(), (select c from (select count(x)over() c from t) rows 1) from rdb$types rows 5;

- то показывает всё ОК:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 select * from t;

       X            Y
======== ============
       1       <null>
       2       <null>
       3       <null>
       4       <null>
       5       <null>
...
Рейтинг: 0 / 0
31.12.2013, 15:14:53
    #38516554
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
И ещё один этюд-изврат на тему апдейта и стабильности курсора. На этот раз без оконных функций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
recreate table t(x int, y int); 
commit;
insert into t values(1, 1);
insert into t values(2, 2);
insert into t values(3, 3);
insert into t values(4, 4);
insert into t values(5, 5);
commit;

Firebird :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
update t 
    set y=(select (select sum(x) from t tx where tx.x<=tt.x) 
             from t tt 
             order by y desc rows 1
          );
select * from t;
  X            Y
=== ============
  1           15
  2            1
  3            1
  4            1
  5            1

Oracle:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
update t 
   set y=(select s from (
                          select (select sum(x) from t tx where tx.x<=tt.x) s 
                          from t tt order by y desc
                        ) 
             where rownum<2
         );
select * from t;

         X          Y
---------- ----------
         1         15
         2         15
         3         15
         4         15
         5         15
...
Рейтинг: 0 / 0
31.12.2013, 17:17:43
    #38516626
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Таблоид,

похоже на cursor stability. Если Влад подтвердит, что это именно оно, то добавь коммент в CORE-3362
...
Рейтинг: 0 / 0
31.12.2013, 17:56:29
    #38516642
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
А по-моему это скорее некэширование результатов некореллированного подзапроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.01.2014, 21:16:01
    #38517443
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Затолкал я в тот тикет эти примеры. И еще один тоже, посерьёзней слегка.
И пусть меня побьют ногами все три Источника Света и Шон вместе с ними, но нутром чую: надо будет еще не раз это всё проверять, в т.ч. апдейты с диктуемым порядком обхода строк (update t set ... order by ... ).
...
Рейтинг: 0 / 0
03.01.2014, 21:26:30
    #38517447
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Таблоид,

про FK это наверное зря. Тут стабильность курсора уже не причём, там другая проблема и следовательно тикет другой надо было создавать.
...
Рейтинг: 0 / 0
03.01.2014, 22:35:39
    #38517480
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Симонов ДенисТут стабильность курсора уже не причём, там другая проблема и следовательно тикет другой надо было создавать.мну кажется, что это всё одного поля ягоды. Если там задать update t set x=y+1 order by x [или y] [а также поиграться c descend], то будет уже другой результат. Опять каким-то боком порядок обработки влияет.
...
Рейтинг: 0 / 0
03.01.2014, 23:21:19
    #38517496
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Таблоид,

там нарушение FK. Это вообще должно работать независимо от стабильности курсора. Ну к тому же ты запудрил мозги серверу каскадным обновлением.
...
Рейтинг: 0 / 0
03.01.2014, 23:33:00
    #38517501
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Симонов Денистам нарушение FK. Это вообще должно работать независимо от стабильности курсора. Ну к тому же ты запудрил мозги серверу каскадным обновлением.Этого нарушения FK *нет*, когда порядок обхода записей задан явно (кляузой order by), можешь проверить.
Сиё означает, что требование тикета: "Cursors should ignore changes made by the same statement" - НЕ выполнено, т.е. курсокр таки УЧИТЫВАЕТ изменения "своего" стейтмента. Вот только эффект от этого учёта сейчас положительный, т.к. не появляется висячих строк. В отличие от других примеров (типа insert into t select * from t).
...
Рейтинг: 0 / 0
03.01.2014, 23:40:00
    #38517506
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Таблоид,

про порядок я ничего и не говорю. Этот тикет ещё не отмечен как решённый. А про порядок говориться вот здесь CORE-2799 . Но всё же моё мнение что FK не должен нарушаться при любых условиях и всё равно стабилен или нет курсор.
...
Рейтинг: 0 / 0
05.01.2014, 13:20:59
    #38517939
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 DDL :
recreate table tm(x int primary key, y int);
insert into tm values(5,5);
insert into tm values(4,5);
insert into tm values(3,2);
insert into tm values(2,2);
insert into tm values(1,0);
commit;
Задача: удалить все строки, в которых для некоторого кортежа {x, y} есть другой кортеж с таким же `y`.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 QUERY-1: 
SQL> select * from tm; delete from tm m where (select count(*) from tm x where x.y=m.y)>1; select * from tm; rollback;  
RESULT-1:
           X            Y
============ ============
           5            5
           4            5
           3            2
           2            2
           1            0


           X            Y
============ ============
           1            0
 -- OK -- 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 QUERY-2: 
SQL> select * from tm; delete from tm m where (select count(*) over()  from tm x where x.y=m.y  rows 1 )>1; select * from tm; rollback;

RESULT-2:
           X            Y
============ ============
           5            5
           4            5
           3            2
           2            2
           1            0


           X            Y
============ ============
           4            5
           2            2
           1            0

Не уверен, относится ли это к стабильности курсора или нет, но вижу, что во WHERE-предикате результат OVER()-функции перевычисляется на каждой обрабатываемой строке. Вместо однократного вычисления на старте стейтмента.
...
Рейтинг: 0 / 0
05.01.2014, 13:36:43
    #38517951
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
1. Стабильность курсора была слегка сломана одним патчем летом. Не трогай её пока не починим.
Ибо сейчас результаты всех твои тесты не имеют ценности. Разве что ради того, чтобы потом их повторить...

2. FK c ON UPDATE CASCADE (уже сам по себе изврат редкостный, но это не отменяет сути проблемы) да ещё и со ссылкой на самого себя никогда не работал на 100% правильно.
В своё время в IB сделали простейшую реализацию каскадных FK, работающую в большинстве простых случаев, но не на 100% корректную.
Стабильный курсор здесь несколько влияет на картину, но он не виноват в не правильной реализации каскадных действий.

3. За постоянное тыкание в одно и тоже место (отсутствие материализации результатов подзапросов) да ещё и где попало,
да ещё и после 100500 кратных объяснений - уйдёшь таки в игнор, сколько можно уже ?
...
Рейтинг: 0 / 0
05.01.2014, 13:47:57
    #38517954
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
hvlad1. Стабильность курсора была слегка сломана одним патчем летом. Не трогай её пока не починим.
Ибо сейчас результаты всех твои тесты не имеют ценности. Разве что ради того, чтобы потом их повторить...Это ты СЕЙЧАС выяснил, что она сломана, или еще летом знал, но "тихо об лёд" ? :-)
hvlad3. За постоянное тыкание в одно и тоже место (отсутствие материализации результатов подзапросов) да ещё и где попало, да ещё и после 100500 кратных объяснений - уйдёшь таки в игнор, сколько можно уже ?я не знаю, ЧТО там сейчас в трёшке: материализуются подзапросы или нет, и в каких случаях... Еще летом я видел, что в каких-то случаях ФБ-3 рвёт как тузик грелку запрос с подзапросом, где 2.5 тихо помирает. Если сейчас опять поломато - ну значит, подождём, не гордые.
В любом случае, тесты приведены, перепроверить теперь можно в любой момент.
...
Рейтинг: 0 / 0
05.01.2014, 14:33:22
    #38517968
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
ТаблоидЭто ты СЕЙЧАС выяснил, что она сломана, или еще летом знал, но "тихо об лёд" ? :-)Сейчас. Так что польза от тебя таки есть :)
...
Рейтинг: 0 / 0
09.01.2014, 14:36:55
    #38520513
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
hvlad1. Стабильность курсора была слегка сломана одним патчем летом.Исправил
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Результат count( F1 )over() в процессе update set F1=null: cursor stability ? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]