Tengo una tabla postgresql que está "congelada", es decir, no ingresan nuevos datos. La tabla se utiliza estrictamente para fines de lectura. La tabla contiene alrededor de 17 millones de registros. La tabla tiene 130 columnas y se puede consultar de varias maneras diferentes. Para hacer las consultas más rápidas, creé índices para todas las combinaciones de filtros que se pueden usar. Así que tengo un total de unos 265 índices sobre la mesa. Cada índice ocupa aproximadamente 1,1 GB. Esto hace que el tamaño total de la tabla sea de alrededor de 265 GB. También he aspirado la mesa.
Pregunta
Si su tabla o índices están inflados, entonces el VACUUM FULL tablename podría reducirlos. Pero si no están hinchados, esto no servirá de nada. Esta no es una operación benigna, bloqueará la tabla por un período de tiempo (necesitará reconstruir cientos de índices, probablemente un largo período de tiempo) y generará grandes cantidades de IO y WAL, el último de los cuales será especialmente problemático para réplicas Así que lo probaría en un clon que no sea de producción para ver si realmente reduce las cosas y ver cuánto tiempo de una ventana de mantenimiento necesitará declarar.
Aparte de eso, sea más juicioso en su elección de índices. ¿Cómo obtuvo la lista de "todas las combinaciones de filtros que se pueden usar"? ¿Fue inspeccionando su código fuente, o simplemente abordando las consultas lentas una por una hasta que se quedó sin consultas lentas? Tal vez pueda mirar instantáneas de pg_stat_user_indexes tomadas con unos días de diferencia para ver si realmente se están utilizando.
¿Son en su mayoría índices de dos columnas?