Tengo dificultades para encontrar explicaciones "simples" de cómo se almacenan en caché los índices en PostgreSQL, por lo que me gustaría comprobar la realidad de cualquiera o de todos estos supuestos:
- Los índices PostgreSQL, como las filas, viven en el disco pero pueden almacenarse en caché.
- Un índice puede estar completamente en la caché o no estar en absoluto.
- Si se almacena en caché o no depende de la frecuencia con la que se usa (según lo definido por el planificador de consultas).
- Por esta razón, la mayoría de los índices 'sensibles' estarán en la caché todo el tiempo.
- Los índices viven en el mismo caché (el
buffer cache
?) Que las filas y, por lo tanto, el espacio de caché utilizado por un índice no está disponible para las filas.
Mi motivación para entender esto se deriva de otra pregunta que pregunté, donde se sugirió que se pueden usar índices parciales en tablas donde nunca se accederá a la mayoría de los datos.
Antes de emprender esto, me gustaría tener claro que emplear un índice parcial produce dos ventajas:
- Reducimos el tamaño del índice en el caché, liberando más espacio para las filas en el caché.
- Reducimos el tamaño del B-Tree, lo que resulta en una respuesta de consulta más rápida.
postgresql
performance
index-tuning
cache
Dukedave
fuente
fuente
Respuestas:
Jugando un poco con pg_buffercache , podría obtener respuestas a algunas de sus preguntas.
pg_buffercache
espectáculos, la respuesta es un SI definitivo . Vale la pena señalar que los datos de la tabla temporal no se almacenan en caché aquí.EDITAR
He encontrado el excelente artículo de Jeremiah Peschka sobre el almacenamiento de tablas e índices. Con información de allí, también podría responder (2) . Configuré una pequeña prueba, para que pueda verificarlos usted mismo.
En general, esto muestra que los índices y las tablas se pueden almacenar en caché página por página, por lo tanto, la respuesta para (2) es NO .
Y una última para ilustrar las tablas temporales que no se almacenan en caché aquí:
fuente
temp_buffers
), para toda la tabla o solo la parte del disco. Yo esperaría lo último. Podría ser una prueba interesante ..Las páginas de índice se obtienen cuando una consulta decide que serán útiles para reducir la cantidad de datos de tabla necesarios para responder una consulta. Solo se leen los bloques del índice navegado para lograr eso. Sí, van al mismo grupo shared_buffers donde se almacenan los datos de la tabla. Ambos también están respaldados por la memoria caché del sistema operativo como una segunda capa de almacenamiento en caché.
Puede tener fácilmente el 0.1% de un índice en la memoria o el 100% de él. La idea de que la mayoría de los "índices 'sensibles' van a estar en la caché todo el tiempo" se resiente cuando tienes consultas que solo tocan un subconjunto de una tabla. Un ejemplo común es si tiene datos orientados al tiempo. A menudo, esos navegan comúnmente por el final reciente de la tabla y rara vez visitan la historia antigua. Allí puede encontrar todos los bloques de índice necesarios para navegar hacia y alrededor del final reciente en la memoria, mientras que muy pocos necesitan navegar por los registros anteriores.
Las partes complicadas de la implementación no son cómo los bloques entran en la memoria caché del búfer. Son las reglas sobre cuándo se van. Mi charla sobre el caché del búfer de PostgreSQL y las consultas de muestra incluidas allí pueden ayudarlo a comprender lo que está sucediendo allí y a ver qué se está acumulando realmente en un servidor de producción. Puede ser sorprendente Hay mucho más sobre todos estos temas en mi libro PostgreSQL 9.0 High Performance también.
Los índices parciales pueden ser útiles porque reducen el tamaño del índice y, por lo tanto, son más rápidos de navegar y dejan más RAM para almacenar en caché otras cosas. Si su navegación por el índice es tal que las partes que toca siempre están en la RAM, de todos modos, eso podría no ser una mejora real.
fuente