¿Hay alguna forma en PostgreSQL de marcar una tabla como datos de almacenamiento que nunca cambiarán después de la inserción, mejorando así el rendimiento? Un ejemplo en el que esto podría ayudar son los escaneos de solo índice y los índices de cobertura :
Sin embargo, para los datos que rara vez cambian, hay una forma de evitar este problema. PostgreSQL rastrea, para cada página en el montón de una tabla, si todas las filas almacenadas en esa página son lo suficientemente antiguas como para ser visibles para todas las transacciones actuales y futuras. Esta información se almacena en un bit en el mapa de visibilidad de la tabla. Una exploración de solo índice, después de encontrar una entrada de índice candidata, verifica el bit del mapa de visibilidad para la página del montón correspondiente. Si está configurado, la fila es visible y, por lo tanto, los datos se pueden devolver sin más trabajo. Si no está configurado, se debe visitar la entrada del montón para averiguar si está visible, por lo que no se obtiene una ventaja de rendimiento sobre un escaneo de índice estándar.
Si PostgreSQL supiera que los datos en una tabla nunca cambian, las entradas del montón nunca tendrían que visitarse en escaneos de solo índice.
Esto es un poco difícil de seguir en la documentación, pero básicamente necesita vacuum la tabla después de haberla creado. Entonces, si no hay cambios (ni bloqueos), no se preocupe.
La documentación explica que aspirar actualiza el mapa de visibilidad:
El comando VACUUM de PostgreSQL tiene que procesar cada tabla regularmente por varias razones:
. . .
- Para actualizar el mapa de visibilidad, lo que acelera los escaneos de solo índice.
Si tiene datos que realmente nunca cambian, ejecute VACUUM (FREEZE) en la tabla. Si no hay una transacción simultánea de larga duración, eso marcará todos los bloques en el mapa de visibilidad como "totalmente congelados" y "totalmente visibles". Entonces obtendrá escaneos de solo índice y el autovacío anti-envolvente no tendrá que hacer ningún trabajo en la mesa.