Я использую Postgres версии 10.01
psql -V
psql (PostgreSQL) 10.5
У меня есть таблица mytable с примерно 250 миллионами строк - моя цель - создать новую таблицу newtable и скопировать примерно половину mytable в newtable (SELECT * WHERE time > '2019-01-01), а затем удалить записи, которые я скопировал из mytable.
Конечно, я хочу сохранить все индексы в mytable.
Какая команда наиболее эффективна для этого в psql? TRUNCATE TABLE эффективен, но удалит все строки. DELETE, вероятно, займет много времени и предотвратит вставку (вставки запланированы каждые 10 минут)
Любые предложения будут полезны
Не имеет отношения, но: psql -V печатает версию утилиты командной строки psql. Это не версия Postgres сервер. Это можно надежно получить, только запустив select version();.
DELETE не помешает вставкам
Если бы вы создали многораздельную таблицу, это было бы очень просто.


Если вы просто пытаетесь удалить строки, не могли бы вы просто рассматривать свое удаление как транзакцию. Если ваша вставка не зависит от существующих данных в таблице, блокировки быть не должно.
Вам нужно будет выполнить два шага.
Сначала скопируйте строки в новую таблицу. Вы можете использовать оператор CREATE..AS SELECT (но после этого вам нужно будет заново создать индексы и другие объекты, такие как ограничения, вручную в новой таблице).
CREATE TABLE new_table
AS SELECT * FROM old_table WHERE time > '2019-01-01
Затем удалите записи из старой таблицы. Похоже, что эффективным способом было бы ПРИСОЕДИНЯТЬСЯ к новой таблице, используя синтаксис DELETE ... USING. Предполагая, что у вас есть первичный ключ с именем id:
DELETE FROM old_table o
USING new_table n
WHERE n.id = o.id
(Обязательно создайте индекс для идентификатора в новой таблице перед запуском этого).
Вставьте все свои строки в новую таблицу, а затем удалите INNER JOIN