Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить все строки поля типа integer на заданную величину максимально быстро / 25 сообщений из 40, страница 1 из 2
25.04.2018, 20:50
    #39636371
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Есть ли варианты за исключением
Код: sql
1.
2.
3.
for select id from table  
    into :id
do update table set id = id + 50 where id = :id


Поле не ключевое, в БД порядка 200 тыс. записей, операция на копии выполняется уже почти 5 часов и неизвестно сколько еще продлится, а нужно намного быстрее
Либо еще вариант создать новое поле id2 = id + 50
Главное условие - сделать это максимально быстро, скажем за 5 минут, а не 5 часов, так как БД почти все время в работе
Есть такая возможность в принципе или нет?
...
Рейтинг: 0 / 0
25.04.2018, 20:53
    #39636373
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010в БД порядка 200 тыс. записей, операция на копии выполняется уже почти 5 часов

Что-то ты явно делаешь неправильно. Даже на миллионе записей эта операция не должна
занимать больше пяти-десяти минут. Надеюсь, показанный запрос - чисто для примера и на
самом деле ты такую глупость не делаешь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2018, 20:57
    #39636374
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Dimitry Sibiryakov, именно так и делаю. Похоже зацикливание?
...
Рейтинг: 0 / 0
25.04.2018, 20:59
    #39636377
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010,

добавь order by id, или переходи на 3-ку
...
Рейтинг: 0 / 0
25.04.2018, 21:08
    #39636380
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010именно так и делаю. Похоже зацикливание?
Зачем for select, имеется ввиду. Почему не просто update?
...
Рейтинг: 0 / 0
25.04.2018, 21:30
    #39636389
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Код: sql
1.
2.
3.
for select id from table order by id desc 
    into :id
do update table set id = id + 50 where id = :id
...
Рейтинг: 0 / 0
25.04.2018, 21:31
    #39636390
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
А если "с контрольным в голову":
Код: sql
1.
2.
3.
for select id from table order by id+0 desc 
    into :id
do update table set id = id + 50 where id = :id
...
Рейтинг: 0 / 0
25.04.2018, 21:35
    #39636392
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Ivan_Pisarevsky, чем отличается предпоследний и последний варианты? Сам дошел уже насчет сортировки, сделал по предпоследнему варианту, но все равно долго, пока не закончилось
...
Рейтинг: 0 / 0
25.04.2018, 21:38
    #39636393
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Последний гарантированно отбросит индекс на сортировке, что вызовет полное кэширование резалтсета и сортировку через темп файл,т.е. это такой хак, чтобы стабилизировать курсор. В трешке это уже исправлено, см. пост Влада выше.
...
Рейтинг: 0 / 0
25.04.2018, 22:03
    #39636401
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010именно так и делаю.

Зачем??? Одного простого update хватит. А при отсутствии индекса по этому полю оно ещё и
работать будет. Но на всякий случай план таки покажи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2018, 22:45
    #39636420
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Да, простой update на удивление сработал за пару минут. Остальные варианты все вешали БД более чем на полчаса, далее убивал процесс. Всем спасибо за помощь
...
Рейтинг: 0 / 0
25.04.2018, 22:50
    #39636424
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010Да, простой update на удивление сработал за пару минутЗависит от упорядоченности данных. Могло не повезти.

PS Индекса на ID небось нет ?
...
Рейтинг: 0 / 0
25.04.2018, 22:54
    #39636425
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
hvlad, на удивление нет )
...
Рейтинг: 0 / 0
25.04.2018, 23:30
    #39636430
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010чем отличается предпоследний и последний варианты?
с этим вопросом вам сюда:
https://www. youtube.com/watch?v=0KITHwMNDtw
...
Рейтинг: 0 / 0
26.04.2018, 00:41
    #39636445
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010hvlad, на удивление нет )И чего тогда удивляться, что 200К фуллсканов - это не "пара минут" ?
...
Рейтинг: 0 / 0
26.04.2018, 09:23
    #39636568
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
арт2010Есть ли варианты за исключениемКонечно есть!
Если для поля отсутствуют ограничения, то просто:
Код: sql
1.
UPDATE yourTable SET intField = intField + 50
...
Рейтинг: 0 / 0
26.04.2018, 11:59
    #39636663
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Ivan_Pisarevskyчто вызовет полное кэширование резалтсета и сортировку через темп файл,т.е. это такой хак, чтобы стабилизировать курсор.

Любопытные приёмчики...

А если бы в исходном цикле поменять условие на сам курсор?

Код: sql
1.
2.
3.
4.
5.
.... where id = :id

-- поменять на

.... where current of For_Cursor_Name



тогда бы могло зациклиться?

возможно, для двойки это был бы более очевидный хак

правда для тройки не рекомендуется, но там вроде само должно работать
...
Рейтинг: 0 / 0
26.04.2018, 12:00
    #39636664
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
А, ещё старый добрый хак

Код: sql
1.
2.
3.
4.
5.
.... where id = :id

-- поменять на

.... where RDB$DB_KEY = :RowKey
...
Рейтинг: 0 / 0
26.04.2018, 12:01
    #39636665
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
AriochА если бы в исходном цикле поменять условие на сам курсор?

Код: sql
1.
2.
3.
4.
5.
.... where id = :id

-- поменять на

.... where current of For_Cursor_Name




тогда бы могло зациклиться?Ты стало бы практически то же самое, что и просто UPDATE без явного курсора
...
Рейтинг: 0 / 0
26.04.2018, 12:07
    #39636671
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
hvlad,

я тоже не вполне понимаю, почему ТС начал цикл городить, вместо того, чтобы просто запустить UPDATE
похоже на него так со всех сторон насели, что мозг заклинило, включилось туннельное зрение, бывает, брррр!

но он начал с цикла, так что мне стало любопытно сделать именно его изначальный цикл работающим с минимальными изменениями в запросе.

И да, where current - именно чтобы не искать запись ещё раз, тем более full-scan'ом, аналог прямогo update.

Но тут снова вопрос к implementation details.
Любое изменение - это новая версия строки.

Не может ли так получиться, что update вставит новую версию записи в свободное место впереди курсора, после чего бегущий fullscan'ом цикл снова на нее наткнётся?

Вроде краем уха слышал, что записи помечались, что они изменены текущим оператором, чтобы этого избежать, но где когда и что слышал, не помню.
...
Рейтинг: 0 / 0
26.04.2018, 12:40
    #39636698
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
AriochВроде краем уха слышал, что записи помечались, что они изменены текущим оператором, чтобы этого избежать, но где когда и что слышал, не помню.

примерно это и сделано в 3.0 для исправления стабильности курсора
...
Рейтинг: 0 / 0
26.04.2018, 12:45
    #39636703
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Симонов Денис,

а в 2.х ?

может вышеупомянутый update ( отдельный или внутри цикла ) снова зацепить созданные сами собой записи ?
...
Рейтинг: 0 / 0
26.04.2018, 12:50
    #39636712
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Arioch,

цикл может, update без where нет
...
Рейтинг: 0 / 0
26.04.2018, 12:54
    #39636714
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
а update с where видимо опять может...

3.0 relnotescontinue updating the same rows ad infinitum ..... because the engine used an implicit cursor for the operations.
...
Рейтинг: 0 / 0
26.04.2018, 12:57
    #39636717
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменить все строки поля типа integer на заданную величину максимально быстро
Симонов Денисupdate без where нет

а почему, интересно?

предположим, на текущей сранице свободного места нет.
оператор изменённую запись записывает в свободное место на следующую страницу.
а если после restore - так и вообще на чистую новую страницу в конец таблицы.

....через некоторое время update который fullscan заканчивает текущую страницу, добирается до следующей - а там новая изменённая версия ему снова попадается.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить все строки поля типа integer на заданную величину максимально быстро / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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