Медленное обновление PostgreSQL с индексом - PullRequest
1 голос
/ 17 апреля 2019

Очень просто обновить, чтобы сбросить 1 столбец в таблице с приблизительно 5 миллионами строк:

UPDATE t_Daily 
SET Price= NULL

Цена не входит ни в один из индексов в этой таблице.

Запуск бездля индексов требуется 45 с.

Выполнение этого с одним или несколькими индексами занимает не менее 20 минут (я продолжаю останавливать его).

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

Любые идеи высоко ценятся.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Найдена дополнительная информация (спасибо Laurenz-Albe за подсказку HOT).

Эта ссылка [https://malisper.me/postgres-heap-only-tuples/] гласит, что

Благодаря MVCC обновление в Postgres состоит из поиска обновляемой строки и вставки новой версии строки обратно в базу данных.Основным недостатком этого является необходимость чтения строки для каждого индекса

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

0 голосов
/ 17 апреля 2019

Это нормально и ожидаемо: обновление индекса может стоить примерно в десять раз дороже, чем обновление самой таблицы. Стол не имеет порядка!

Если price не проиндексирован, вы можете использовать ГОРЯЧИЕ обновления, чтобы избежать обновления индексов. Чтобы использовать это, таблица должна быть определена с fillfactor меньше 100, чтобы обновленные строки могли умещаться в том же блоке, что и исходные строки.

...