Формирование индекса Force Postgres
У меня есть очень долго работающая функция, которая является процессом импорта, и в настоящее время она работает. Он работал в течение 10 часов, и, по моим подсчетам, для его завершения потребуется около 16-24 часов.
Однако одна из причин, по которой это занимает так много времени, заключается в том, что одна из таблиц, которые она использует для поиска (а также записи в нее), не проиндексирована должным образом.
Я не могу прервать функцию, так как это заставит ее откатить транзакцию и отменить последние 10 часов работы. Однако я не могу создать индекс, пока он находится в середине операции, потому что он сохраняет блокировку таблицы.
Можно ли каким-либо образом заставить Postgres получить явную блокировку таблицы и создать индекс (приостановив выполнение функции во время ее создания)?
Если нет, могу ли я прервать функцию, не откатив назад работу, которую он проделал до сих пор?
1 ответ
Вы можете создать индекс concurrently
на создание индекса уходит больше времени, но при этом создается одновременный доступ к таблице.
Тем не менее, это все равно не поможет, потому что оператор running не будет внезапно менять свой план выполнения "в полете" для переключения на тот, который использует индекс.
И нет, утверждение всегда атомарно. Если заявление отменено, вся проделанная работа откатывается.
Насколько я могу сказать, у вас есть два варианта:
- дождаться окончания процесса
- завершите импорт и перезапустите его, надеясь, что он будет работать быстрее, чем оставшиеся 10 часов после установки индекса.