Как сжать таблицу pg_toast?

Я работаю на Postgres 9.3 на Mac OSX, и у меня есть база данных, которая вышла из-под контроля. Раньше у меня была таблица, в которой был один столбец, в котором хранились большие данные. Затем я заметил, что размер базы данных увеличился примерно до 19 ГБ только из-за таблицы pg_toast. Затем я удаляю упомянутую колонку и запускаю вакуум, чтобы снова получить БД меньшего размера, но он остался прежним. Итак, как я могу уменьшить размер базы данных?

 SELECT nspname || '.' || relname AS "relation"
       ,pg_size_pretty(pg_relation_size(C.oid)) AS "size" 
 FROM pg_class C 
     LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) 
 WHERE nspname NOT IN ('pg_catalog', 'information_schema') 
 ORDER BY pg_relation_size(C.oid) DESC 
 LIMIT 20;

результаты в

 pg_toast.pg_toast_700305                    | 18 GB
 pg_toast.pg_toast_700305_index              | 206 MB
 public.catalog_hotelde_images               | 122 MB
 public.routes                               | 120 MB



    VACUUM VERBOSE ANALYZE pg_toast.pg_toast_700305;                                                                                                                                            INFO:  vacuuming "pg_toast.pg_toast_700305"
INFO:  index "pg_toast_700305_index" now contains 9601330 row versions in 26329 pages
DETAIL:  0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.06s/0.02u sec elapsed 0.33 sec.
INFO:  "pg_toast_700305": found 0 removable, 0 nonremovable row versions in 0 out of 2393157 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 0 unused item pointers.
0 pages are entirely empty.
CPU 0.06s/0.07u sec elapsed 0.37 sec.
VACUUM

структура таблицы маршрутов

id serial NOT NULL,
  origin_id integer,
  destination_id integer,
  total_time integer,
  total_distance integer,
  speed_id integer,
  uid bigint,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  CONSTRAINT routes_pkey PRIMARY KEY (id)

Ответ 1

Попробуйте следующее:

vacuum full

Ответ 2

Вы можете использовать один из двух типов пылесоса: стандартный или полный.

стандарт:

VACUUM table_name;

полный:

VACUUM FULL table_name; 

Помните, что VACUUM FULL блокирует стол, на котором он работает, до его завершения.

Возможно, вы захотите выполнять стандартный вакуум чаще на ваших таблицах, которые часто загружаются/удаляются, это может не дать вам столько места, сколько вакуум заполнен, но вы сможете запускать такие операции, как SELECT, INSERT, UPDATE и DELETE, и это займет меньше времени, чтобы завершить.

В моем случае, когда pg_toast (вместе с другими таблицами) вышел из-под контроля, стандартный VACUUM внес небольшую разницу, но этого оказалось недостаточно. Я использовал VACUUM FULL, чтобы освободить больше места на диске, что было очень медленно при больших отношениях. Я решил настроить автовакуум и чаще использовать стандартный VACUUM на своих таблицах, которые часто обновляются.

Если вам нужно использовать VACUUM FULL, вы должны делать это, когда ваши пользователи менее активны. Также не выключайте автоочистку.

Вы можете получить дополнительную информацию, добавив подробные данные к своим командам:

VACUUM FULL VERBOSE table_name;