Как влияет размер записи переупорядочения столбцов в PostgreSQL? - PullRequest
1 голос
/ 08 апреля 2010

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

Итак, что делает PostgreSQL с памятью, освобождаемой удаленными столбцами? Повторно ли он использует память, поэтому одна запись занимает столько же места, сколько раньше? Но для этого потребуется перезапись всей таблицы, поэтому, чтобы избежать этого, она просто оставляет кучу пустого места в каждой записи?

Ответы [ 3 ]

1 голос
/ 08 апреля 2010

Почему вы «переупорядочиваете»? В SQL нет порядка, он не имеет смысла. Если вам нужен фиксированный порядок, сообщите запросам, какой порядок вам нужен, или используйте представление, для этого и созданы представления.

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

Ваш нынешний подход приведет к снижению общей производительности (блокировка таблиц), придется воссоздавать индексы, статистические данные уходят в унитаз и т. Д. И т. Д. И, в конце концов, вы получите ту же ситуацию, что у вас уже была. Так почему же усилия?

1 голос
/ 29 октября 2014

Вопрос старый, но поскольку оба ответа неверны или вводят в заблуждение, я добавлю еще один.

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

Обычный VACUUM не возвращает дисковое пространство из физического файла, содержащего таблицу, в систему, если он не находит полностью мертвые или пустые блоки в физическом конце таблицы. Вам нужно запустить VACUUM FULL или CLUSTER, чтобы агрессивно сжать стол и вернуть избыточное пространство в систему. Это обычно нежелательно при нормальной работе. Postgres может повторно использовать мертвые кортежи для сохранения новых версий строк на той же странице данных, что повышает производительность.

В вашем случае , поскольку вы обновляете каждую строку, размер таблицы удваивается (по сравнению с ее минимальным размером). Желательно запустить VACUUM FULL или CLUSTER, чтобы вернуть наворот в систему.
Оба берут эксклюзивный замок на столе. Если это мешает одновременному доступу, рассмотрите pg_repack, который может делать то же самое без исключительных блокировок.

Чтобы уточнить: Запуск CLUSTER полностью освобождает место. Нет VACUUM FULL необходимо после CLUSTER (и наоборот).

Подробнее:

1 голос
/ 08 апреля 2010

Из документов :

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

Вам нужно будет сделать CLUSTER, а затем VACUUM FULL, чтобы освободить место.

...