Задать вопрос

Блокирует ли процесс построения индексов таблицу?

Не могу найти в документации.
Проблема такая. Есть таблица на 100 млн записей. Мне потребовалось добавить одно поле и потом я решил заполнить его сделав
UPDATE (SET a = 'foo' where field и LIKE '%pattern%')
по нему.
Перед UPDATE я индекс по нему сделал, и как понимаю это была большая ошибка.

В итоге прошли сутки, у меня загружено одно ядро и все другие UPDATE запросы (не связанные с этим полем обрабатываются по 10 минут).

Отсюда вопрос:
1. Правильно ли я понимаю что hash индексы не могут использовать сразу все ядра
1.1 а btree могут?
2. Как быть в текущей ситуации. Я понимаю что индекс нужно было после UPDATE делать, но как понять через сколько процесс закончится? Может подождать стоит?
3. Почему UPDATE не связанный с этим полем так тормозит?
  • Вопрос задан
  • 609 просмотров
Подписаться 6 Простой Комментировать
Ответ пользователя d'Ivan К ответам на вопрос (2)
2ord
@2ord

UPDATE (SET a = 'foo' where field и LIKE '%pattern%')
Нужно было перед командой добавить "EXPLAIN ANALYSE ", тогда можно было узнать план запроса, не выполняя его.
3. Почему UPDATE не связанный с этим полем так тормозит?
См. выше.

Особенно когда
Есть таблица на 100 млн записей.

Кроме того, что за индекс был добавлен на поле, по которому выполняется LIKE? Если B-tree, Hash, то это имеет нулевую ценность для ускорения запроса. По этому полю возможно нужен GIN индекс (pg_trgm). Или даже необходимо перепроектировать таблицы, вынеся это поле, разбив на множество записей и связью N:M. Мы не знаем что за данные в том поле.

Для экспериментов лучше создавать ограниченный набор данных, приближенный к продакшн и тестировать на нем, вместо на 100М записей.
Ответ написан