Maximale Tabellengröße in InterBase (vor 2009)
Dmitry Kuzmenko, 20. Oktober 2009
Bei der Bearbeitung eines interessanten technischen Support-Vorfalls mit einem unserer Kunden haben wir festgestellt, dass die tatsächliche maximale Anzahl von Zeilen von der angegebenen Grenze abweicht.
In der Dokumentation [Operations Guide for InterBase 6, Seite 27, InterBase Specification] können wir Folgendes lesen:
“Maximale Anzahl von Zeilen und Spalten pro Tabelle: Per Design 2^32 Zeilen, da Zeilen mit einer 32-Bit-Ganzzahl ohne Vorzeichen pro Tabelle nummeriert werden.”
Natürlich werden Zeilen mit einer 32-Bit-Ganzzahl nummeriert. Leider kann jedoch keine Tabelle jemals die Grenze von 2 Milliarden Datensätzen erreichen - selbst eine Tabelle mit nur einer Spalte nicht.
Der Grund für dieses Verhalten liegt im Algorithmus zur Berechnung des freien Speicherplatzes für neue (eingefügte) Datensätze - es kann zu einem Ganzzahlüberlauf kommen, und Sie werden die folgende Fehlermeldung in interbase.log sehen:
pointer page vanished from DPM_next (249)
Und die Realität ist, dass die Datenbankseitengröße oder Zeilengröße diese Grenze nicht beeinflusst. Die Grenze ist eine magische Tabellengröße, die immer gleich ist (~36,6 Gigabyte) und für jede Datenbankseitengröße in Seiten wie folgt berechnet werden kann:
Die maximale Seitenanzahl für eine Tabelle kann wie folgt berechnet werden:
MaxDataPageCount = (MaxInt / PageSize) * 17.476
MaxInt ist natürlich = 2147483647. Setzen Sie Ihre Datenbankseitengröße anstelle von PageSize ein, und das Ergebnis zeigt, wie viele Seiten für eine beliebige Tabelle zugewiesen werden können.
Beispielsweise kann eine Tabelle in einer Datenbank mit 4K-Seitengröße nicht mehr als etwa 9 Millionen Datenseiten haben.
Aus Sicht der Datensatzanzahl kann eine Tabelle mit 2 Integer-Spalten nicht größer als 600 Millionen (!) Datensätze werden (vergessen Sie nicht, dass jeder Datensatz einen 14-Byte-Header hat).
Verwirrt? Multiplizieren Sie MaxDataPageCount mit PageSize und teilen Sie das Ergebnis durch die durchschnittliche Datensatzgröße Ihrer größten Tabelle - dann wissen Sie, wann diese Tabelle die Grenze überschreitet und Ihre Datenbank nicht mehr funktionieren wird.
Diese Grenze wurde erst in Firebird 2 behoben. Sie besteht in InterBase 2007 weiterhin.
Wenn Sie Fragen oder Anregungen zu den Informationen auf dieser Seite haben, können Sie sich gerne über [email protected] an unser Forschungsteam wenden. Wir freuen uns auch über Informationen zu interessanten und/oder seltsamen Dingen im Zusammenhang mit InterBase oder Firebird.