|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Из-за MVCC получаем что UPDATE можно рассматривать как DELETE+INSERT. При использовании ORM бывает что вне зависимости от того сколько полей изменили, получаем UPDATE table1 set x1=y1, x2=y2... и так далее по всем полям таблицы, кроме pk. 1. Имеет ли смысл, в ручную указывать только измененные поля? 2. Если смысла нет, но допустим поле x2 не изменилось, но на нем есть индекс, это что-то меняет для 1го вопроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 12:13 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
jim0mИз-за MVCC получаем что UPDATE можно рассматривать как DELETE+INSERT. При использовании ORM бывает что вне зависимости от того сколько полей изменили, получаем UPDATE table1 set x1=y1, x2=y2... и так далее по всем полям таблицы, кроме pk. 1. Имеет ли смысл, в ручную указывать только измененные поля? 2. Если смысла нет, но допустим поле x2 не изменилось, но на нем есть индекс, это что-то меняет для 1го вопроса? Скорее, как инсерт + пометка на удаление. Имеет смысл точно указывать поля. Поскольку данные, не помещающиеся в сколько-то там килобайт - пишутся в тост-структуры, отдельные. Особенно, всякие тексты и прочие переменные строки с массивами. Это всё тоже бухнет. Поэтому может помочь. Ещё полезно - реорганизовать структуру таблиц, чтоб первыми шли поля с фиксированной длинной. А всякие тексты/бины/массивы шли потом. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 13:07 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
jim0m, Имеет. ORM часто делает UPDATE даже если он не нужен (нет изменений), проще вроде так. Даже если апдейт нужен, то не надо дёргать все поля — меньше нагрузка на индексы и тосты. В связи с индексами тоже имеет. Почитайте про Heap-Only Tuples (HOT) оптимизацию. Если коротко, то апдейты не затрагивающие индексированные колонки ( возможно ) не делают вставку в индексы (зависит от доступности места в блоке таблицы). Если индексированные колонки меняются (хоть одна), то база должна добавить запись во все индексы таблицы. Это одна из причин по которой Убер недавно решил уйти с ПЖ. В разработке Write Amplification Reduction Method (WARM) оптимизация, которая позволит базе менять не все индексы, а только те, которые относятся к изменяемым колонкам. Т.к. feature freeze для 10-ки запланирован на 31/Мар, я не уверен, что патч войдёт, очень сложный он. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 13:12 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Так господа. А теперь по делу. При обновлении код срабатывания 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 делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 14:14 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Конкурентная среда это отдельная тема, чего только стоит реализация счетчиков на ORM - нужно использовать для этого специальные методы, неочевидные на первый взгляд. В данном случае, меня интересовал именно сам механизм обновления. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 14:40 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Maxim Boguk, А можно вопрос для общего развития... Если многострочный апдейт формально отработал для некоторой строки, но при этом не изменил значения ни в одном поле. То затронет ли эта транзакция каким-то образом такую строку, наложит какие-нибудь локи,..? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 14:44 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
LeXa NalBatMaxim Boguk, А можно вопрос для общего развития... Если многострочный апдейт формально отработал для некоторой строки, но при этом не изменил значения ни в одном поле. То затронет ли эта транзакция каким-то образом такую строку, наложит какие-нибудь локи,..? Без специальных мер в виде установленного https://www.postgresql.org/docs/9.6/static/functions-trigger.html на таблице строка будет обновлена (скорее всего HOT update) и повесит все соответствующие локи. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 14:53 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Maxim BogukПри обновлении код срабатывания HOT проверяет изменилось ли поле или нет НЕ ПО НАЛИЧИЮ его в update запросе а по совпадению внутреннего двоичного представления (поэтому простановка значения которая значение моля не меняет не влияет ни на HOT ни на TOAST механику причем TOAST если он не изменился даже при cold update останется в одной копии). Поэтому на вопрос 2 - не для вопроса 1 и для HOT update это ничего не меняет. На вопрос 1 - в среднем лучше конечно только измененные обновлять но не изза HOT update оптимизации а по причине более корректной работы в конкурентной среде. HOT не зависит от значений, а только от факта появления новой версии записи в куче. Т.е. если UPDATE произошел, то будет либо HOT-цепочка, либо новая "независимая" запись и все индексы надо "обновить". Насчёт TOAST -- согласен, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 19:00 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
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 (что верно). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 07:38 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Maxim Boguk, Согласен, надо было точнее формулировать. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 10:28 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Maxim Bogukдает нагрузку лишнюю только на 2 вещиеще на триггеры update of другое_поле. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 12:23 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
> Убер недавно решил уйти с ПЖ 1) он совсем ушёл на свои костыли с баз данных 2) заявленные причины сильно сомнительны по тем решениям, которые были выбраны. Так как реальных показателей узких мест не озвучено ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2017, 09:28 |
|
Оптимальность UPDATE
|
|||
---|---|---|---|
#18+
Misha TyurinТак как реальных показателей узких мест не озвучено Уером — нет. Однако в pgsql-hackers было серьезное обсуждение, которое быстро переключилось на существующие недостатки и как с ними бороться. Повышенная IO активность на таблицах с большим кол-вом индексов и частыми UPDATE-ми был одним из таких недостатков. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2017, 10:38 |
|
|
start [/forum/topic.php?fid=53&fpage=76&tid=1996618]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 347ms |
total: | 471ms |
0 / 0 |