Каждый день рано утром задание pgAgent обновляет содержимое таблицы A из таблицы B моей базы данных PostgreSQL 8.4. Таблица A содержит около 140 тыс. Записей в 91 столбце и имеет два индекса - один как часть PRIMARY KEY, а другой - индекс GIST в столбце геометрии POINT PostGIS.
Чтобы ускорить процесс, задание сбрасывает индекс в столбце геометрии, перед удалением записей в таблице A и вставкой записей из таблицы B индекс воссоздается. Все это делается, когда демон автовакуума начинает работать, когда ему это нравится (примерно через десять минут после сравнения статистики работы и статистики таблицы по времени завершения работы и времени работы автоочистки).
После проверки таблицы сегодня утром после всего того, что произошло, статистика таблицы сообщила мне, что размер таблицы составляет 272 МБ, размер таблицы TOAST - 8192 байта, а размер индекса - 23 МБ. Это казалось довольно большим, поэтому я ввел команду REINDEX для таблицы, и размер индекса сократился до 9832 КБ.
Мой вопрос (ы) заключается в следующем:
Почему REINDEX, очевидно, так сильно уменьшает размер индексов, когда индексы (или, по крайней мере, индекс столбца геометрии) были построены заново с нуля? Должен ли я убедиться, что таблица была очищена пылесосом / проанализирована до построения индексов? Не является ли снижение индекса по первичному ключу фактором в этом? Что мне не хватает?
ANALYZE
сообщаемый размер тоже уменьшится.