powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимальность UPDATE
13 сообщений из 13, страница 1 из 1
Оптимальность UPDATE
    #39429939
jim0m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из-за MVCC получаем что UPDATE можно рассматривать как DELETE+INSERT. При использовании ORM бывает что вне зависимости от того сколько полей изменили, получаем UPDATE table1 set x1=y1, x2=y2... и так далее по всем полям таблицы, кроме pk.
1. Имеет ли смысл, в ручную указывать только измененные поля?
2. Если смысла нет, но допустим поле x2 не изменилось, но на нем есть индекс, это что-то меняет для 1го вопроса?
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430036
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jim0mИз-за MVCC получаем что UPDATE можно рассматривать как DELETE+INSERT. При использовании ORM бывает что вне зависимости от того сколько полей изменили, получаем UPDATE table1 set x1=y1, x2=y2... и так далее по всем полям таблицы, кроме pk.
1. Имеет ли смысл, в ручную указывать только измененные поля?
2. Если смысла нет, но допустим поле x2 не изменилось, но на нем есть индекс, это что-то меняет для 1го вопроса?
Скорее, как инсерт + пометка на удаление.
Имеет смысл точно указывать поля.
Поскольку данные, не помещающиеся в сколько-то там килобайт - пишутся в тост-структуры,
отдельные. Особенно, всякие тексты и прочие переменные строки с массивами.
Это всё тоже бухнет. Поэтому может помочь.
Ещё полезно - реорганизовать структуру таблиц, чтоб первыми шли поля с фиксированной
длинной. А всякие тексты/бины/массивы шли потом.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430046
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jim0m,

Имеет. ORM часто делает UPDATE даже если он не нужен (нет изменений), проще вроде так. Даже если апдейт нужен, то не надо дёргать все поля — меньше нагрузка на индексы и тосты.


В связи с индексами тоже имеет. Почитайте про Heap-Only Tuples (HOT) оптимизацию. Если коротко, то апдейты не затрагивающие индексированные колонки ( возможно ) не делают вставку в индексы (зависит от доступности места в блоке таблицы). Если индексированные колонки меняются (хоть одна), то база должна добавить запись во все индексы таблицы. Это одна из причин по которой Убер недавно решил уйти с ПЖ.

В разработке Write Amplification Reduction Method (WARM) оптимизация, которая позволит базе менять не все индексы, а только те, которые относятся к изменяемым колонкам. Т.к. feature freeze для 10-ки запланирован на 31/Мар, я не уверен, что патч войдёт, очень сложный он.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430133
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так господа. А теперь по делу.

При обновлении код срабатывания HOT проверяет изменилось ли поле или нет НЕ ПО НАЛИЧИЮ его в update запросе а по совпадению внутреннего двоичного представления (поэтому простановка значения которая значение моля не меняет не влияет ни на HOT ни на TOAST механику причем TOAST если он не изменился даже при cold update останется в одной копии).
Поэтому на вопрос 2 - не для вопроса 1 и для HOT update это ничего не меняет.
На вопрос 1 - в среднем лучше конечно только измененные обновлять но не изза HOT update оптимизации а по причине более корректной работы в конкурентной среде.

Представьте себе такой сценарий:
вот ORM считал пользователя например когда он логинится
далее сразу после этого (просто совпало по времени модератор проставил пользователю статус blocked=true
после чего ORM на странице логина сохраняет запись для пользователя чтобы проставить ему logged_date=NOW() например, ну и естественно заодно и проставит ему blocked=false потому что такое значение было когда обьект из базы вычитали ;).
Модератор создает баг что пользователь не блокируется через интерфейс.
А теперь подумайте - надо ли вам такие приколы ловить в production и как именно вы их будете отлаживать?

Ну и сетевой траффик пожалейте.
И как уже правильно написали - не надо пустые update делать.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430162
jim0m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конкурентная среда это отдельная тема, чего только стоит реализация счетчиков на ORM - нужно использовать для этого специальные методы, неочевидные на первый взгляд. В данном случае, меня интересовал именно сам механизм обновления.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430177
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

А можно вопрос для общего развития...

Если многострочный апдейт формально отработал для некоторой строки, но при этом не изменил значения ни в одном поле. То затронет ли эта транзакция каким-то образом такую строку, наложит какие-нибудь локи,..?
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430192
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatMaxim Boguk,

А можно вопрос для общего развития...

Если многострочный апдейт формально отработал для некоторой строки, но при этом не изменил значения ни в одном поле. То затронет ли эта транзакция каким-то образом такую строку, наложит какие-нибудь локи,..?

Без специальных мер в виде установленного https://www.postgresql.org/docs/9.6/static/functions-trigger.html на таблице
строка будет обновлена (скорее всего HOT update) и повесит все соответствующие локи.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430412
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukПри обновлении код срабатывания HOT проверяет изменилось ли поле или нет НЕ ПО НАЛИЧИЮ его в update запросе а по совпадению внутреннего двоичного представления (поэтому простановка значения которая значение моля не меняет не влияет ни на HOT ни на TOAST механику причем TOAST если он не изменился даже при cold update останется в одной копии).
Поэтому на вопрос 2 - не для вопроса 1 и для HOT update это ничего не меняет.
На вопрос 1 - в среднем лучше конечно только измененные обновлять но не изза HOT update оптимизации а по причине более корректной работы в конкурентной среде.
HOT не зависит от значений, а только от факта появления новой версии записи в куче.
Т.е. если UPDATE произошел, то будет либо HOT-цепочка, либо новая "независимая" запись и все индексы надо "обновить".
Насчёт TOAST -- согласен, да.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430603
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovMaxim BogukПри обновлении код срабатывания HOT проверяет изменилось ли поле или нет НЕ ПО НАЛИЧИЮ его в update запросе а по совпадению внутреннего двоичного представления (поэтому простановка значения которая значение моля не меняет не влияет ни на HOT ни на TOAST механику причем TOAST если он не изменился даже при cold update останется в одной копии).
Поэтому на вопрос 2 - не для вопроса 1 и для HOT update это ничего не меняет.
На вопрос 1 - в среднем лучше конечно только измененные обновлять но не изза HOT update оптимизации а по причине более корректной работы в конкурентной среде.
HOT не зависит от значений, а только от факта появления новой версии записи в куче.
Т.е. если UPDATE произошел, то будет либо HOT-цепочка, либо новая "независимая" запись и все индексы надо "обновить".
Насчёт TOAST -- согласен, да.

Путаница из-за
"Даже если апдейт нужен, то не надо дёргать все поля — меньше нагрузка на индексы и тосты." - по смыслу звучит так что указание поля в update комманде не меняя значения может как то изменить для базы факт использования или нет HOT и/или toast, а это не так. По факту указание лишних полей в update дает нагрузку лишнюю только на 2 вещи - на сеть и на парсер sql (не особо заметную если в таблице не многие сотни полей).

и из-за
" Если коротко, то апдейты не затрагивающие индексированные колонки (возможно) не делают вставку в индексы" - так как понимать слово "затрагивающие" можно двояко:
или как указание этих колонок в update set списке (что не верно)
или факт реальной смены значения колонки в результате update (что верно).
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430692
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Согласен, надо было точнее формулировать. Спасибо.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39430795
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukдает нагрузку лишнюю только на 2 вещиеще на триггеры update of другое_поле.
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39431481
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Убер недавно решил уйти с ПЖ

1) он совсем ушёл на свои костыли с баз данных
2) заявленные причины сильно сомнительны по тем решениям, которые были выбраны. Так как реальных показателей узких мест не озвучено
...
Рейтинг: 0 / 0
Оптимальность UPDATE
    #39431494
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha TyurinТак как реальных показателей узких мест не озвучено
Уером — нет.

Однако в pgsql-hackers было серьезное обсуждение, которое быстро переключилось на существующие недостатки и как с ними бороться. Повышенная IO активность на таблицах с большим кол-вом индексов и частыми UPDATE-ми был одним из таких недостатков.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимальность UPDATE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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