Performancevergleich Firebird 2.5 vs 3 oder 4 bei prepared inserts
Verfasst: Sa 20. Nov 2021, 04:20
Hallo alle,
beim Durchgehen der Neuerungen / Bugfixe von Firebird 3.0.8 fiel mir dieses ältere Ticket auf: https://github.com/FirebirdSQL/firebird/issues/5877. Es geht dabei um den erhöhten Speicherbedarf, den prepared statements bei Firebird 3 oder 4 im Vergleich zu Firebird 2.5 anscheinend haben. Der Bugfix, in Firebird 4 schon länger umgesetzt, wurde jetzt zu Firebird 3.0.8 zurückportiert, was aber in beiden Versionen nicht bedeutet, dass die nennenswerten Unterschiede beim Speicherbedarf im Vergleich zu Firebird 2.5 damit vollständig beseitigt sind, sondern nur etwas verringert. Firebird 3 und 4 verwalten mehr Kontext in den Strukturen für die Statements als Firebird 2.5, von daher lässt sich das wohl nicht komplett wegoptimieren.
Konkret fiel mir das in einer Testanwendung auf, die bulk inserts in eine DB macht, über ODBC werden irgendwelche Quellen mit Millionen von Datensätzen gelesen und nach Firebird importiert. Dabei werden jeweils 100K Sätze gelesen, übergeben und jeweils nach 100K Sätzen findet ein commit statt. Das commit ist nicht der Punkt, aber die "Rundenzeit", also die Zeit für die Übergabe der 100K Statements an den Server braucht bei Firebird 4 zumindest bei meinen Tests reproduzierbar etwas länger als bei 2.5. Größenordnung bspw 6 statt 5 Sekunden auf einem bestimmten Rechner, also schon signifikant. Hat man bspw 1,5 Mio Sätze zu importieren, sind das 15 sek mehr, insgesamt dann 90 statt 75 sek, immerhin 20% mehr.
Diese Zeitabweichung scheint auch abzuhängen von der Hardware und ist auf verschiedenen Rechnern (mit oder ohne Virtualisierung) unterschiedlich hoch, aber vorhanden. Irgendwie plausibel, wenn man von einem erhöhten Speicherbedarf bei Firebird 3 oder 4 ausgeht. In meinem Testszenario waren alle Komponenten gleich, also die selbe Anwendung, die selben Datenquellen, die selbe fbclient (2.5.9), ZielDB gleich konfiguriert, zb bei DefaultDbCachePages, keine Indizes auf der Zieltabelle, nur am anderen Ende entweder Firebird 2.5 oder Firebird 4 (der für legacy Zugriff über die 2.5.9er fbclient konfiguriert ist). Für Firebird 3 müsste das genauso zutreffen.
Falls ihr Anwendungen habt, die Masseninserts via prepared statements machen, könnt ihr die Beobachtung bestätigen, dass Firebird 3 oder 4 gegenüber 2.5 mehr Zeit dafür braucht? Es muss mindestens in der Größenordnung mehrere 100K Sätze sein, sonst ist der Effekt nicht wahrnehmbar.
Viele Grüße, Volker
beim Durchgehen der Neuerungen / Bugfixe von Firebird 3.0.8 fiel mir dieses ältere Ticket auf: https://github.com/FirebirdSQL/firebird/issues/5877. Es geht dabei um den erhöhten Speicherbedarf, den prepared statements bei Firebird 3 oder 4 im Vergleich zu Firebird 2.5 anscheinend haben. Der Bugfix, in Firebird 4 schon länger umgesetzt, wurde jetzt zu Firebird 3.0.8 zurückportiert, was aber in beiden Versionen nicht bedeutet, dass die nennenswerten Unterschiede beim Speicherbedarf im Vergleich zu Firebird 2.5 damit vollständig beseitigt sind, sondern nur etwas verringert. Firebird 3 und 4 verwalten mehr Kontext in den Strukturen für die Statements als Firebird 2.5, von daher lässt sich das wohl nicht komplett wegoptimieren.
Konkret fiel mir das in einer Testanwendung auf, die bulk inserts in eine DB macht, über ODBC werden irgendwelche Quellen mit Millionen von Datensätzen gelesen und nach Firebird importiert. Dabei werden jeweils 100K Sätze gelesen, übergeben und jeweils nach 100K Sätzen findet ein commit statt. Das commit ist nicht der Punkt, aber die "Rundenzeit", also die Zeit für die Übergabe der 100K Statements an den Server braucht bei Firebird 4 zumindest bei meinen Tests reproduzierbar etwas länger als bei 2.5. Größenordnung bspw 6 statt 5 Sekunden auf einem bestimmten Rechner, also schon signifikant. Hat man bspw 1,5 Mio Sätze zu importieren, sind das 15 sek mehr, insgesamt dann 90 statt 75 sek, immerhin 20% mehr.
Diese Zeitabweichung scheint auch abzuhängen von der Hardware und ist auf verschiedenen Rechnern (mit oder ohne Virtualisierung) unterschiedlich hoch, aber vorhanden. Irgendwie plausibel, wenn man von einem erhöhten Speicherbedarf bei Firebird 3 oder 4 ausgeht. In meinem Testszenario waren alle Komponenten gleich, also die selbe Anwendung, die selben Datenquellen, die selbe fbclient (2.5.9), ZielDB gleich konfiguriert, zb bei DefaultDbCachePages, keine Indizes auf der Zieltabelle, nur am anderen Ende entweder Firebird 2.5 oder Firebird 4 (der für legacy Zugriff über die 2.5.9er fbclient konfiguriert ist). Für Firebird 3 müsste das genauso zutreffen.
Falls ihr Anwendungen habt, die Masseninserts via prepared statements machen, könnt ihr die Beobachtung bestätigen, dass Firebird 3 oder 4 gegenüber 2.5 mehr Zeit dafür braucht? Es muss mindestens in der Größenordnung mehrere 100K Sätze sein, sonst ist der Effekt nicht wahrnehmbar.
Viele Grüße, Volker