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

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


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

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

При обновлении код срабатывания 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
30.03.2017, 14:40
    #39430162
jim0m
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимальность UPDATE
Конкурентная среда это отдельная тема, чего только стоит реализация счетчиков на ORM - нужно использовать для этого специальные методы, неочевидные на первый взгляд. В данном случае, меня интересовал именно сам механизм обновления.
...
Рейтинг: 0 / 0
30.03.2017, 14:44
    #39430177
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимальность UPDATE
Maxim Boguk,

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

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

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

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

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

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

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

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


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