powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменить все строки поля типа integer на заданную величину максимально быстро
40 сообщений из 40, показаны все 2 страниц
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636371
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ли варианты за исключением
Код: 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
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010в БД порядка 200 тыс. записей, операция на копии выполняется уже почти 5 часов

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

добавь order by id, или переходи на 3-ку
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636380
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010именно так и делаю. Похоже зацикливание?
Зачем for select, имеется ввиду. Почему не просто update?
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636389
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636390
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если "с контрольным в голову":
Код: 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
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636392
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky, чем отличается предпоследний и последний варианты? Сам дошел уже насчет сортировки, сделал по предпоследнему варианту, но все равно долго, пока не закончилось
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636393
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний гарантированно отбросит индекс на сортировке, что вызовет полное кэширование резалтсета и сортировку через темп файл,т.е. это такой хак, чтобы стабилизировать курсор. В трешке это уже исправлено, см. пост Влада выше.
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636401
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010именно так и делаю.

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

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

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

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

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

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

.... where current of For_Cursor_Name



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

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

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

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

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

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

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

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

.... where current of For_Cursor_Name




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

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

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

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

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

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

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

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

а в 2.х ?

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

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

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

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

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

....через некоторое время update который fullscan заканчивает текущую страницу, добирается до следующей - а там новая изменённая версия ему снова попадается.
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636725
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochоператор изменённую запись записывает в свободное место на следующую страницу.

Так не бывает. Запись привязана к странице и не может перемещаться, поэтому natural не
зациклится хоть его режь.

Единственный способ зациклить простой update это получить ему plan index или order по
индексу на изменяемом поле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636735
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНе может ли так получиться, что update вставит новую версию записи в свободное место впереди курсора, после чего бегущий fullscan'ом цикл снова на нее наткнётся?Физическая запись никогда не меняет своего адреса.
Она его получает при insert и освобождает только после delete + сборка мусора.
Апдейт создаёт бекверсии, но голова цепочки версий всегда живёт по старому адресу.
Поэтму fullscan мог зациклиться, только если создаются новые записи (insert into t select from t).
Т.е. update\delete + fullscan - не может зациклиться.

AriochВроде краем уха слышал, что записи помечались, что они изменены текущим оператором, чтобы этого избежатьНе так, но меры в 3-ке приняты и подобных побочных эффектов там нет.
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636746
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladАпдейт создаёт бекверсии, но голова цепочки версий всегда живёт по старому адресу.

ага, понятно, это я видимо после недавней статьи PostgresSQL vs InnoDB попутал

но тут тоже неполнятно, ведь записи в FB пакуются побайтово в RLE

это означает, что обновлённая запись может оказаться менее удачной для RLE и после упаковки стать длиннее старой версии, и просто "не влезть" в местое, которое занимала старая запись?
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636747
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЗапись привязана к странице и не может перемещаться

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

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

если для нового образа первичной версии нет места на странице, она будет фрагментированна и часть её переползёт на другую страницу.
Но голова всё равно останется на месте.
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636751
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

ага, так понятно, спасибо

сразу появляется тролльское желание зарезать кэш БД в ровно одну страницу и попробовать вычитать такую запись, сможет ли сервер разумно обработать такую ошибку
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636768
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochсразу появляется тролльское желание зарезать кэш БД в ровно одну страницуЕсть ограничение снизу = 50 страниц ;)
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636828
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

можно сказать, что уползание головы на другую страницу и/или на другое место в той же странице (в любой момент, по любой причине) - проявляется как изменение RDB$DB_KEY ? Что это один и тот же процесс ?

И соотв. читая рассуждения про как-бы-стабильность значений RDB$DB_KEY можно оценить, в каких случаях головы ползают, а в каких остаются на месте ?
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636831
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch что уползание головы на другую страницу и/или на другое место в той же странице (в любой момент, по любой причине) - проявляется как изменение RDB$DB_KEY
НЕТ. Ну что за попытки ересь какую-то сочинить. rdb$db_key - это номер записи, той самой головы, про которую hvlad уже два раза сказал.
Arioch в каких случаях головы ползают
ни в каких.
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636833
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RDB$DB_KEY состоит из номера страницы и положения записи на ней. Выводы сделать сумеешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636843
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvArioch в каких случаях головы ползают
ни в каких.Именно так
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39636999
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

если тебя и KDV объединить, то получается, что RDB$DB_KEY не меняется никогда.
а это не так, иначе бы его использовали вместо синтетических ПК и не парились

например, из известной статьи

This also leads well to a discussion why you cannot rely on the record position to persist
1) after a backup/restore
2) or after your transaction has committed
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39637004
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch1) after a backup/restore
2) or after your transaction has committed
первое верно, потому что надо понимать, что такое restore (и это просто инсерт)
а второе - чешуя.
...
Рейтинг: 0 / 0
Изменить все строки поля типа integer на заданную величину максимально быстро
    #39637008
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после коммита может быть собран мусор (после удаления записи) и на это же место может попасть другая запись, есс-но с тем же RDB$DB_KEY. Это как раз и нарушает его "стабильность", если держать ссылку "за щекой" между транзакциями - она может протухнуть.

Но у одной и той же записи RDB$DB_KEY не меняется никогда, заголовок записи не имеет права перемещаться (на самом деле - может внутри страницы, но это уже детали).

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

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


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