CREATE TABLE thai_transport (
id SERIAL PRIMARY KEY,
data JSONB
);
INSERT INTO thai_transport (data)
SELECT jsonb_build_object(
'ticket_id', i,
'destination', 'Bangkok',
'price', (random() * 1000)::int,
'status', 'in_transit'
)
FROM generate_series(1, 1000000) AS s(i);
CREATE INDEX idx_thai_transport_data ON thai_transport USING GIN (data);
UPDATE thai_transport SET data = jsonb_set(data, '{status}', '"delivered"');
CREATE EXTENSION IF NOT EXISTS pgstattuple;
SELECT free_percent FROM pgstattuple('thai_transport');
50.07
VACUUM FULL thai_transport; но нужна эксклюзивная блокировка
pg_repack -t thai_transport но это стороннее расширение
Если мы говорим о предотвращении блоатинга в момент вставки:
Разделение вставки на небольшие батчи с последующим вакуумированием после каждой итерации
Уменьшить fillfactor для таблицы
REINDEX INDEX CONCURRENTLY idx_thai_transport_data;