Формирование индекса Force Postgres

У меня есть очень долго работающая функция, которая является процессом импорта, и в настоящее время она работает. Он работал в течение 10 часов, и, по моим подсчетам, для его завершения потребуется около 16-24 часов.

Однако одна из причин, по которой это занимает так много времени, заключается в том, что одна из таблиц, которые она использует для поиска (а также записи в нее), не проиндексирована должным образом.

Я не могу прервать функцию, так как это заставит ее откатить транзакцию и отменить последние 10 часов работы. Однако я не могу создать индекс, пока он находится в середине операции, потому что он сохраняет блокировку таблицы.

Можно ли каким-либо образом заставить Postgres получить явную блокировку таблицы и создать индекс (приостановив выполнение функции во время ее создания)?

Если нет, могу ли я прервать функцию, не откатив назад работу, которую он проделал до сих пор?

1 ответ

Вы можете создать индекс concurrently на создание индекса уходит больше времени, но при этом создается одновременный доступ к таблице.

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

И нет, утверждение всегда атомарно. Если заявление отменено, вся проделанная работа откатывается.

Насколько я могу сказать, у вас есть два варианта:

  1. дождаться окончания процесса
  2. завершите импорт и перезапустите его, надеясь, что он будет работать быстрее, чем оставшиеся 10 часов после установки индекса.
Другие вопросы по тегам