172 похожих чатов

Теоретический вопрос, если делать update tablename set fieldname = fieldname,

то будет ли сервер перезаписывать эти строчки в смысле mvcc? а потом будет ли их чистить вакуум?

14 ответов

16 просмотров

Да и да. На эту тему есть даже: https://www.postgresql.org/docs/current/functions-trigger.html (suppress_redundant_updates_trigger)

Oleg-Makarikhin Автор вопроса
Yaroslav Schekin
Да и да. На эту тему есть даже: https://www.postgr...

у меня обратное. хочется без блокируемого вакуум фулл пожать занимаемое пространство. не жалея диски.

Oleg Makarikhin
у меня обратное. хочется без блокируемого вакуум ф...

Таким способом -- без шансов. Используйте pg_repack.

Oleg Makarikhin
у меня обратное. хочется без блокируемого вакуум ф...

Ну так PostgreSQL будет сопротивляться. ;) Т.е. пытаться записать новые версии на ту же страницу, применить HOT и т.д.

Ilya Anfimov
Таким способом -- без шансов. Используйте pg_repa...

вакуум обновляет карту свободного места. если делать фиктивные апдейты для записей в физическом конце таблицы, они переедут в свободное место ближе к началу. затем опять вакуум — он будет отрезать хвост таблицы, если там пустые (после вакуумирования) блоки. это используется в pgcompacttable

Виктор Егоров
вакуум обновляет карту свободного места. если дела...

Насколько я помню, pgcompacttable для этого запрещает писать в соответствующие страницы как-то. А без этого postgres стремится вписать новый тапл сначала на ту жэ страницу, что и был.

Виктор Егоров
не запрещает ничего

А, я глянул сейчас. Там смешнее, он забивает крайнюю страницу копиями тупла из этой жэ транзакцыи пока место не кончится.

хм, нет, зачем? одного обновления достаточно. не придумывайте

Виктор Егоров
хм, нет, зачем? одного обновления достаточно. не п...

-- Update all the tuples in the range FOR _ctid IN EXECUTE _update_query USING _ctid_list LOOP IF _ctid > _max_ctid THEN _result_page := -1; EXIT _outer_loop; ELSIF _ctid >= _min_ctid THEN -- The tuple is still in the range, more updates are needed _next_ctid_list := _next_ctid_list || _ctid; END IF; END LOOP;

Виктор Егоров
хм, нет, зачем? одного обновления достаточно. не п...

Ну, а как ещё? Просто update на полупустую последнюю страницу -- скорее всего, оставит всё на той жэ страницэ через слинкованные update.

Виктор Егоров
хм, нет, зачем? одного обновления достаточно. не п...

Точнее -- понятно, как, переписывать движок, вводить какие-то запреты на страницы и вообще, кстати, хинты на cluster table -- чтобы тапл писался в соответствии с примерным его местом. Но это, понятно, опять куча работы.

Виктор Егоров
хм, нет, зачем? одного обновления достаточно. не п...

Нет, недостаточно. См. выше (или исходники pgcompacttable, как уже показали). Ну или вот: https://dbfiddle.uk/?rdbms=postgres_13&fiddle=07f4e2fb8f828078ae7b53927aaf71ee PostgreSQL предыдущих версий тут "сдадутся" несколько быстрее, но общий принцип тот же — сервер будет стараться оптимизировать update (доступными способами) так, чтобы предотвратить использование "лишних" страниц.

Yaroslav Schekin
Нет, недостаточно. См. выше (или исходники pgcompa...

И то, надо заметить, что запись выпихивают на предыдущую страницу, а не в начало...

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта