ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот вопрос похож на вопрос здесь, но ни один из этих ответов не работает для моей проблемы, так как я буду объясните позже.
Я пытаюсь скопировать большую таблицу (~ 40M строк, более 100 столбцов) в postgres, где индексируется большое количество столбцов. В настоящее время я использую этот бит SQL:
CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;
Этот метод имеет две проблемы:
- Он добавляет индексы перед проглатыванием данных, поэтому это займет намного больше времени, чем создание таблицы без индексов, а затем индексация после копирования всех данных.
- Это не правильно копирует столбцы стиля SERIAL. Вместо того, чтобы настраивать новый "счетчик" в новой таблице, он устанавливает значение по умолчанию столбца в новой таблице в счетчик прошлой таблицы, то есть он не будет увеличиваться по мере добавления строк.
Размер таблицы делает индексацию проблемой в реальном времени. Это также делает невозможным сбрасывание файла, а затем повторное проглатывание. У меня также нет преимущества командной строки. Мне нужно сделать это в SQL.
То, что я хотел бы сделать, это либо прямо сделать точную копию с помощью какой-либо команды чуда, либо, если это невозможно, скопировать таблицу со всеми ограничениями, но без индексов, и убедиться, что они являются ограничениями в духе '(он же новый счетчик для столбца SERIAL). Затем скопируйте все данные с помощью SELECT *
, а затем скопируйте все индексы.
Источники
-
Вопрос о переполнении стека о копировании базы данных. Это не то, о чем я прошу по трем причинам.
- Он использует параметр командной строки
pg_dump -t x2 | sed 's/x2/x3/g' | psql
и в этом параметре у меня нет доступа к командной строке - Он создает индексы предварительной записи данных, которые медленны
- Он не обновляет последовательные столбцы правильно в качестве доказательства
default nextval('x1_id_seq'::regclass)
- Он использует параметр командной строки
-
Метод reset значение последовательности для таблицы postgres: Это замечательно, но, к сожалению, оно очень ручное.