Tout dans la base de données est organisé sous forme de pages de taille fixe de structure connue - il existe neuf types de pages différents. Le cache de page est l’intermédiaire entre les parties « fonctionnelles » de la base de données et le disque.
Au démarrage, Firebird lit la page d’en-tête de la base de données, puis la première page de pointeur d’une table système appelée RDB$PAGES à partir de laquelle il sait alors où trouver les pages de pointeurs, entre autres, pour les tables système et utilisateur de la base de données.
Dès que l’application accède à la base de données et commence une transaction, Firebird lit les pages de pointeur lui indiquant où trouver les pages de données des tables impliquées dans les transactions de l’application. Toutes les pages vont dans le cache et y restent jusqu’à ce que le cache soit complètement plein. Lorsqu’il n’y a pas d’endroit où placer la page suivante, Firebird publie la page la moins récemment utilisée – pas la première lue, mais celle qui a été référencée le moins récemment et qui n’a pas été modifiée.
Lorsqu’une transaction est validée - et à d’autres moments - Firebird écrit les pages modifiées par cette transaction sur le disque, mais ne les libère pas du cache - cela permet d’éviter une lecture supplémentaire si la page est à nouveau requise bientôt.
Au fil du temps et avec un peu de chance, vous vous retrouvez avec les pages les plus fréquemment modifiées et référencées résidant dans le cache - il s’agit des pages d’inventaire des transactions, des pages de pointeur pour les tables actives, de la page d’en-tête, des niveaux supérieurs des index, etc. Les données et les pages d’index de niveau inférieur sont échangées selon les besoins, mais le cache sera toujours plein.
Vous pouvez utiliser les tables MON$ (à partir de Firebird 2.1, en particulier MON$IO_STATS) pour déterminer la qualité de l’utilisation de votre cache. Ils signalent le nombre d’extractions par rapport aux lectures, c’est-à-dire le nombre de fois où les pages ont été consultées par rapport au nombre de fois où elles ont dû être lues à partir du disque. Lorsque le nombre de lectures augmente considérablement, vous avez trop réduit le cache.
Les tables MON$ vous donneront également le nombre de marques par rapport aux écritures, ce qui vous indique le nombre de fois que les pages sont modifiées par rapport au nombre de fois où les pages ont été écrites sur le disque. Lorsque vous voyez le nombre d’écritures sur le disque augmenter, vous avez probablement trop réduit le cache.