J'ai du mal à trouver des explications «profanes» sur la façon dont les index sont mis en cache dans PostgreSQL, donc je voudrais une vérification de la réalité sur l'une ou l'ensemble de ces hypothèses:
- Les index PostgreSQL, comme les lignes, vivent sur le disque mais peuvent être mis en cache.
- Un index peut être entièrement dans le cache ou pas du tout.
- Le fait qu'il soit mis en cache ou non dépend de la fréquence à laquelle il est utilisé (tel que défini par le planificateur de requêtes).
- Pour cette raison, la plupart des index «sensibles» seront toujours dans le cache.
- Les index vivent dans le même cache (le
buffer cache
?) Que les lignes, et donc l'espace de cache utilisé par un index n'est pas disponible pour les lignes.
Ma motivation pour comprendre cela découle d' une autre question. J'ai demandé où il était suggéré que des index partiels puissent être utilisés sur des tables où la majorité des données ne seront jamais consultées.
Avant d'entreprendre cela, je tiens à préciser que l'utilisation d'un indice partiel présente deux avantages:
- Nous réduisons la taille de l'index dans le cache, libérant ainsi plus d'espace pour les lignes elles-mêmes dans le cache.
- Nous réduisons la taille de l'arbre B, résultant en une réponse de requête plus rapide.
postgresql
performance
index-tuning
cache
dukedave
la source
la source
Réponses:
En jouant un peu avec pg_buffercache , je pourrais obtenir des réponses à certaines de vos questions.
pg_buffercache
spectacles, la réponse est un OUI définitif . Il convient de noter que les données de table temporaires ne sont pas mises en cache ici.ÉDITER
J'ai trouvé un excellent article de Jeremiah Peschka sur le stockage des tables et des index. Avec des informations à partir de là, je pourrais également répondre (2) . J'ai mis en place un petit test, afin que vous puissiez les vérifier vous-même.
Dans l'ensemble, cela montre que les index et les tables peuvent être mis en cache page par page, donc la réponse pour (2) est NON .
Et une dernière pour illustrer les tables temporaires non mises en cache ici:
la source
temp_buffers
) - pour la table entière ou juste la partie sur le disque. Je m'attendrais à ce dernier. Cela pourrait être un test intéressant ..Les pages d'index sont récupérées lorsqu'une requête décide qu'elles seront utiles pour réduire la quantité de données de table nécessaires pour répondre à une requête. Seuls les blocs de l'index parcourus pour y parvenir sont lus. Oui, ils vont dans le même pool shared_buffers où les données de la table sont stockées. Les deux sont également pris en charge par le cache du système d'exploitation en tant que deuxième couche de mise en cache.
Vous pouvez facilement avoir 0,1% d'un index en mémoire ou 100% de celui-ci. L'idée que la plupart des "index" sensibles seront dans le cache tout le temps "échoue lorsque vous avez des requêtes qui ne touchent qu'un sous-ensemble d'une table. Un exemple courant est si vous avez des données temporelles. Souvent, ceux-ci naviguent généralement vers la fin récente du tableau, rarement en regardant l'histoire ancienne. Vous y trouverez peut-être tous les blocs d'index nécessaires pour naviguer vers et autour de la fin récente en mémoire, tandis que très peu nécessaires pour naviguer dans les enregistrements précédents sont là.
Les parties compliquées de l'implémentation ne sont pas la façon dont les blocs entrent dans le cache de tampon. Ce sont les règles concernant leur départ. Mon exposé sur le cache de tampon PostgreSQL et les exemples de requêtes inclus peuvent vous aider à comprendre ce qui s'y passe et à voir ce qui s'accumule vraiment sur un serveur de production. Cela peut être surprenant. Il y a beaucoup plus sur tous ces sujets dans mon livre PostgreSQL 9.0 High Performance .
Les index partiels peuvent être utiles car ils réduisent la taille de l'index et sont donc à la fois plus rapides à naviguer et laissent plus de RAM pour la mise en cache d'autres choses. Si votre navigation dans l'index est telle que les parties que vous touchez sont toujours en RAM, de toute façon, cela n'achètera peut-être pas une réelle amélioration.
la source