Усечение части таблицы postgres

Я использую 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 минут)

Любые предложения будут полезны

Вставьте все свои строки в новую таблицу, а затем удалите INNER JOIN

dfundako 16.01.2019 18:32

Не имеет отношения, но: psql -V печатает версию утилиты командной строки psql. Это не версия Postgres сервер. Это можно надежно получить, только запустив select version();.

a_horse_with_no_name 16.01.2019 18:52
DELETE не помешает вставкам
a_horse_with_no_name 16.01.2019 18:53

Если бы вы создали многораздельную таблицу, это было бы очень просто.

Laurenz Albe 16.01.2019 20:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
767
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы просто пытаетесь удалить строки, не могли бы вы просто рассматривать свое удаление как транзакцию. Если ваша вставка не зависит от существующих данных в таблице, блокировки быть не должно.

Ответ принят как подходящий

Вам нужно будет выполнить два шага.

Сначала скопируйте строки в новую таблицу. Вы можете использовать оператор 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

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

Другие вопросы по теме