Как ИЗМЕНИТЬ набор секционированных таблиц в Postgres?

Я создал набор секционированных таблиц в Postgres и начал вставлять много строк через главную таблицу. Когда у меня произошел сбой в процессе загрузки, я понял, что должен был объявить строку идентификатора BIGSERIAL (BIGINT с последовательностью, за кулисами), но непреднамеренно установил ее как SERIAL (INTEGER). Теперь, когда у меня загружено несколько миллиардов строк, я пытаюсь изменить столбец на BIGINT. Кажется, что процесс работает, но занимает много времени. Так что, на самом деле, я действительно не знаю, работает ли он или он завис. Я бы предпочел не перезапускать весь процесс загрузки снова.

Какие-либо предложения?


person punkish    schedule 21.06.2010    source источник


Ответы (2)


Перезапустите его (уточняющее редактирование: снова перезапустите весь процесс загрузки).

Для изменения значения столбца требуется новая версия строки, и все индексы, указывающие на старую версию, должны быть обновлены, чтобы указывать на новую версию.

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


Исправление от @archnid:

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

person Community    schedule 21.06.2010
comment
в порядке. Из вашего ответа мне не ясно, предлагаете ли вы перезапустить сервер или повторить весь процесс загрузки данных. Вы предлагаете мне перезагрузить базу данных, поскольку ИЗМЕНЕНИЕ главной таблицы в любом случае займет примерно столько же времени? - person punkish; 22.06.2010
comment
Я должен был также добавить... У меня нет никаких индексов в таблице, даже первичного ключа. - person punkish; 22.06.2010
comment
Я предлагаю вам повторить весь процесс загрузки, так как изменение таблицы займет намного больше времени. Однако полное отсутствие индексов устраняет одну из самых больших проблем массовых массовых обновлений. Оставшаяся проблема заключается в том, что вам потребуется в два раза больше места на диске, а затем, когда вы закончите, половина вашей таблицы будет пустой. У меня нет недавнего опыта работы с большими унаследованными таблицами, поэтому я не знаю, как это повлияет на решение. - person Stephen Denne; 22.06.2010
comment
изменение типа столбца приведет к перезаписи таблицы, так что управление версиями строк не представляет большой проблемы, но все равно временно займет много места на диске. обычно вы можете отслеживать прогресс, просматривая, какие файлы в каталоге базы данных добавляются к... - person araqnid; 22.06.2010

Когда вы обновляете строку, чтобы изменить ее в PostgreSQL, она записывает новую копию строки, а затем выполняет некоторую очистку, чтобы удалить оригинал. Это означает, что попытка решить проблему путем выполнения обновлений может занять больше времени, чем просто повторная загрузка всех данных с нуля — это больше дискового ввода-вывода, чем загрузка новой копии, а также некоторое дополнительное время обработки. Единственная ситуация, когда вы захотите выполнить обновление вместо перезагрузки, — это когда первоначальная загрузка была очень неэффективной, например, если медленная клиентская программа вставляет данные, и это является узким местом в процессе.

Чтобы выяснить, работает ли процесс, посмотрите, использует ли он ЦП при запуске top (системы UNIX) или диспетчера задач (Windows). В Linux «top -c» даже покажет вам, что делают клиентские процессы PostgreSQL. Вы, вероятно, просто ожидали, что это займет меньше времени, чем первоначальная загрузка, чего не произойдет, и он все еще работает, а не зависает.

person Greg Smith    schedule 22.06.2010