Не уверен, что это быстрее, но, возможно, вам придется проверить это.Попробуйте это до тех пор, пока PostgreSQL не сможет обработать требуемый тип изменения, не переписывая всю вонючую таблицу.
ALTER TABLE log_foot_mark RENAME refer_url TO refer_url_old;
ALTER TABLE log_foot_mark ADD COLUMN refer_url character varying(256);
Затем с помощью индексированного первичного ключа или уникального ключа таблицы выполните циклическую транзакцию.Я думаю, что вам придется делать это через Perl или другой язык, который вы можете делать коммит каждую итерацию цикла.
WHILE (end < MAX_RECORDS)LOOP
BEGIN TRANSACTION;
UPDATE log_foot_mark
SET refer_url = refer_url_old
WHERE id >= start AND id <= end;
COMMIT TRANSACTION;
END LOOP;
ALTER TABLE log_foot_mark DROP COLUMN refer_url_old;
Имейте в виду, что логика цикла должна быть в чем-то отличном от PL \ PGSQL, чтобызаставить его совершить каждую итерацию цикла.Протестируйте его без всяких циклов и циклов с размером транзакции 10k 20k 30k и т. Д. До тех пор, пока не найдете подходящее место.