У меня есть таблица postgres. Мне необходимо
удалить некоторые данные из него.
Полагаю, что ...
delete from yourtable
where <condition(s)>
... по какой-то причине не сработает. (Хотите поделиться этой причиной?)
Я собирался создать временный
таблицу, скопируйте данные в, воссоздайте
индексы и удалить строки я
необходимо.
Посмотрите на pg_dump и pg_restore. Использование pg_dump с некоторыми умными опциями и, возможно, редактирование вывода перед pg_restoring может помочь.
Поскольку вы проводите анализ данных типа "что, если", я хотел бы знать, не лучше ли вам использовать представления.
Вы можете определить представление для каждого сценария, который вы хотите проверить, основываясь на отрицании того, что вы хотите исключить. Т.е., определить представление на основе того, что вы хотите включить. Например, если вам нужно «окно» в данных, где вы «удалили» строки, где X = Y, то вы бы создали представление в виде строк, где (X! = Y).
Представления хранятся в базе данных (в системном каталоге) в качестве определяющего запроса. Каждый раз, когда вы запрашиваете представление, сервер базы данных ищет базовый запрос, который его определяет, и выполняет его (И с любыми другими используемыми вами условиями). У этого подхода есть несколько преимуществ:
- Вы никогда не дублируете какую-либо часть своих данных.
- Индексы, которые уже используются для базовой таблицы (вашей исходной «реальной» таблицы), будут использоваться (как это будет сочтено подходящим для оптимизатора запросов) при запросе каждого представления / сценария. Нет необходимости переопределять или копировать их.
- Поскольку представление является «окном» (НЕ шейпшотом) для «реальных» данных в базовой таблице, вы можете добавлять / обновлять / удалять в своей базовой таблице и просто повторно запрашивать сценарии представления без необходимости воссоздайте что угодно, так как данные меняются со временем.
Конечно, есть компромисс. Поскольку представление является виртуальной таблицей, а не «реальной» (базовой) таблицей, вы фактически выполняете (возможно, сложный) запрос каждый раз, когда получаете к нему доступ. Это может немного замедлить ход событий. Но это не так. Это зависит от многих проблем (размер и характер данных, качество статистики в системном каталоге, скорость аппаратного обеспечения, нагрузка на использование и многое другое). Вы не узнаете, пока не попробуете. Если (и только если) вы на самом деле обнаружите, что производительность неприемлемо низкая, вы можете посмотреть на другие варианты. (Материализованные представления, копии таблиц, ... все, что меняет пространство на время.)