Как сжать таблицу тостов pg?

Я работаю на postgres 9.3 на mac osx, и у меня есть база данных, которая вышла из-под контроля. Раньше у меня была таблица с одним столбцом, в котором хранились большие данные. Затем я заметил, что размер БД вырос до 19gb только из-за таблицы 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)

2 ответов


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

vacuum full

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

имейте в виду, что вакуум полностью блокирует таблицу, над которой он работает, пока она не будет закончена.

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

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

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