Taille maximale d'une table dans InterBase (avant 2009)
Dmitry Kuzmenko, 20-Oct-2009
En travaillant sur un incident de support technique intéressant avec l’un de nos clients, nous avons découvert que le nombre maximal réel de lignes diffère de la limite déclarée.
Dans la documentation [Operations Guide for InterBase 6, page 27, InterBase Specification], nous pouvons lire ce qui suit :
« Nombre maximal de lignes et de colonnes par table : Par conception, 2^32 lignes, car les lignes sont énumérées avec un entier non signé de 32 bits par table. »
Bien sûr, les lignes sont énumérées par un entier de 32 bits. Malheureusement, aucune table ne peut en réalité atteindre la limite de 2 milliards d’enregistrements - même une table avec une seule colonne.
La raison de ce comportement réside dans l’algorithme de calcul de l’espace libre pour un nouvel enregistrement (inséré) - un dépassement d’entier peut se produire et vous verrez le message d’erreur suivant dans interbase.log :
pointer page vanished from DPM_next (249)
Et, en réalité, la taille de page de la base de données ou la taille de ligne n’affecte pas cette limite. La limite est une taille de table magique qui est toujours la même (~36,6 gigaoctets) et peut être calculée en pages pour toute taille de page de base de données comme suit :
Le nombre maximal de pages pour une table peut être calculé comme suit :
MaxDataPageCount = (MaxInt / PageSize) * 17.476
MaxInt, bien sûr, = 2147483647. Remplacez PageSize par la taille de page de votre base de données et le résultat indiquera combien de pages peuvent être allouées pour toute table.
Par exemple, une table ne peut pas avoir plus de ~9 millions de pages de données dans une base de données avec une taille de page de 4 Ko.
Du point de vue du nombre d’enregistrements, une table avec 2 colonnes entières ne peut pas dépasser 600 millions (!) d’enregistrements (n’oubliez pas que chaque enregistrement a un en-tête de 14 octets).
Confus ? Multipliez MaxDataPageCount par PageSize, puis divisez le résultat par la taille moyenne d’enregistrement de votre plus grande table - vous saurez quand cette table dépassera la limite et votre base de données cessera de fonctionner.
Cette limite n’a été corrigée que dans Firebird 2. Elle existe toujours dans InterBase 2007.
Si vous avez des questions ou des suggestions concernant les informations sur cette page, n’hésitez pas à contacter notre équipe de recherche via [email protected]. Nous accueillons également toute information concernant des choses intéressantes et/ou étranges liées à InterBase ou Firebird.