Читали ли вы документацию PostgreSQL для " Использование EXPLAIN ", чтобы интерпретировать вывод, который вы показываете?
Я не обычный пользователь PostgreSQL, но я просто прочитал этот документ, а затем сравнил с выводом EXPLAIN
, который вы показываете. Ваш запрос UPDATE
, похоже, не использует индексы, и он вынужден выполнять сканирование таблиц для сортировки page
и pagelinks
. Сортировка, без сомнения, достаточно велика, чтобы требовать временные файлы на диске, которые, я думаю, создаются под вашим temp_tablespace
.
Тогда я вижу приблизительные прочитанные страницы базы данных. Верхний уровень этого вывода EXPLAIN
говорит (cost=127710692.21..135714045.43)
. Единицы здесь находятся в доступе дискового ввода-вывода. Таким образом, он получит доступ к диску более 135 миллионов раз, чтобы сделать это UPDATE
.
Обратите внимание, что даже 10 000 об / мин дисков с временем поиска 5 мсек могут достичь в лучшем случае 200 операций ввода-вывода в секунду при оптимальных условиях. Это будет означать, что на UPDATE
потребуется 188 часов (7,8 дня) дискового ввода-вывода, даже если вы могли бы поддерживать насыщенный дисковый ввод-вывод в течение этого периода (то есть непрерывного чтения / записи без перерывов). Это невозможно, и я ожидаю, что фактическая пропускная способность будет по крайней мере на порядок меньше, тем более что вы без сомнения использовали этот сервер для всех видов другой работы. Так что я думаю, что вы только часть пути через ваш UPDATE
.
Если бы это был я, я бы убил этот запрос в первый день и нашел бы другой способ выполнения UPDATE
, который бы лучше использовал индексы и не требовал сортировки на диске. Вы, вероятно, не можете сделать это в одном выражении SQL.
Что касается вашего DROP INDEX
, я бы предположил, что это просто блокировка, ожидание монопольного доступа к таблице, и пока он находится в этом состоянии, я думаю, вы, вероятно, можете его убить.