Блокирует ли процесс построения индексов таблицу?
и тут же
Перед UPDATE я индекс по нему сделал
Ну и как сам думаешь?
Мне потребовалось добавить одно поле
добавление поля без DEFAULT, допускающего NULL значение, пройдет быстро. Если его надо заполнять (есть DEFAULT, или как вы руками), это уже апдейт на 100 млн строк.
1. Правильно ли я понимаю что hash индексы не могут использовать сразу все ядра
1.1 а btree могут?
Вообще ни при чем ни hash, ни btree индексы.
В postgres есть только parallel queries - параллельные запросы, которые могут выполняться несколькими потоками. Параллельных апдейтов нет.
3. Почему UPDATE не связанный с этим полем так тормозит?
Основной апдейт грузит машину + если другие апдейты пытаются изменить те же строки в таблице, они у вас, скорее всего, не тормозят, а просто отваливаются по таймауту. Ибо строки заблокированы основной бесконечной транзакцией.
Какое поле изменяется (то же самое или нет), значения не имеет.
2. Как быть в текущей ситуации. Я понимаю что индекс нужно было после UPDATE делать, но как понять через сколько процесс закончится? Может подождать стоит?
Прибейте этот апдейт для начала. Ничего страшного не произойдет. Никто вам тут не скажет, сколько еще он будет висеть. Может, он сам ждет какой-то блокировки.
Потом VACUUM ANALYZE на таблицу.
Что касается заполнения поля, из вопроса непонятны условия. Вы во всей таблице (или большей ее части) хотите это сделать? Или вот это:
where field и LIKE '%pattern%'
- выборка все же малого числа строк (сколько примерно?)?
* вообще-то стоило бы до UPDATE дернуть SELECT с тем же условием и посмотреть, сколько времени уйдет на него*
Простой индекс не сработает с запросами вида ilike '%pattern%'. Поставьте расширение pg_trgm и
сделайте GIN индекс. Опять же, если надо заполнить полтаблицы, индекс не спасет, надо будет разбивать UPDATE на куски.