Feb. 2006 Der Chefentwickler der Parity Software, Schwieberdingen bei Stuttgart
nennt in einem Interview Qt, Perl und db++ seine bevorzugte
Entwicklungsumgebung, mit der man Anwendungssoftware so flexibel und effizient,
wie es sich nur wünschen lässt, entwickeln kann. Er freut sich noch heute
über den Hinweis der Concept asa vor acht Jahren auf Qt, das damals zur Entscheidung
gegen Java und Nutcracker anstand.
Jan. 2006 Die Exact Software Deutschland, München
liefert wie jedes Jahr den Update für ihr Lohn- und Gehaltsabrechnungssystem LohnXL/XXL mit dem Datenbankkern db++ auf Windows für über 10.000
Installationen aus.
Sept. 2005 Die Parity Software, Schwieberdingen bei Stuttgart
liefert nach umfangreichen Tests mit ihrem Applikations-Simulationsprogramm dbstresser die Version 8.11.29 an ihre
Kunden aus.
Sept. 2005 Auslieferung eines spezifisch auf die
Belange der dsoftware, Neuss
zugeschnittenen Updates, das mit der dort eingesetzten ASS-Entwicklungsumgebung
und db++ Variante kompatibel ist. Wesentlich ist dabei die Möglichkeit,
Tabellen mit mehr als 2GB Größe auf der 32Bit-Betriebssystemvariante von Linux
und ab Dez. 2005 auch auf Windows einzusetzen.
2004/2005 Der David
Concept asa zwingt in einem langwierigen Markenrechtsstreit
den Goliath DB AG in die Knie. Seit September 1997
versuchte die Concept asa die Marke db++
nicht nur als Bildzeichen, da war es schon seit 1990 in Deutschland und im
Ausland geschützt, sondern auch als Wortzeichen schützen zu lassen. Nach
anfänglichen Widerständen gelang dies im Februar 2001. Die Freude bei der
Concept asa währte jedoch nicht lange, da die DB AG im Oktober 2002 erfolgreich
die Löschung der Wortmarke erreichte. In einer endgültigen Verhandlung vor dem
27ten Senat des Bundespatentgerichtes Ende August 2004 setzte sich die Concept
asa aber abschließend durch. Das
Wortzeichen db++ ist jetzt endgültig alleiniges Eigentum der Concept asa.
Wir sind jedoch nicht nachtragend und fahren weiter auf Fernreisen bevorzugt
mit der Bahn, sofern wir nicht unseren bescheidenen Geschäftswagen, einen
3L-Lupo, gemäß dem Motto „db++ ist das 3L-Auto unter den Datenbanksystemen -
schlank, schnell und effizient“, benutzen.
2003/2005 Entwicklung der db++ Versionen 8.11.19 bis
8.11.31. Im Einzelnen erfolgten dabei folgende Erweiterungen/Optimierungen:
Wenn im
folgenden viel über Performancegewinne berichtet wird, dann heißt dies nicht,
dass db++ bisher langsam gewesen ist; im Gegenteil db++ war bisher schon immer sehr schnell – es ist
aber unser Ehrgeiz weiterhin zu den schnellsten Datenbanken zugehören, ganz
abgesehen davon dass ein erfolgreiches Optimieren unsere
Kunden und uns selbst immer wieder neu motiviert.
in 2003
- Beginn
der völligen Integration der Linux/Unix und Windows Makefilesysteme mit
dem Ziel, dass ein simples „make“ genügt, um db++ auf allen Plattformen zu
kompilieren.
- Übertragung
und erste Implementation der für EADS Airbus für Sun Sparc entwickelten
Möglichkeit Tabellen >2GB zu
verwenden auf die Betriebssysteme Linux und Windows.
- Dabei im
Linux/Unix-relevaten Teil des Sourcecodes
Ersetzen der letzten verbliebenen nicht-posix-konformen Aufrufe
durch posix-konforme. In der neuen
2005 fertig entwickelten >2GB-Version von db++ werden jedoch
unter Windows nicht mehr die orginalen Posix-Aufrufe genutzt, sondern
interne native, effizientere Windows Input/Output Calls von einem
posix-liken Interface aus, da sich in der Windows-Umgebung die orginalen
Posix-Aufrufe als zu langsam erwiesen haben.
- Es
erfolgte ein teilweises Redesign des Mapping-Mechanismus, der virtuelle
Tabellennamen den realen Direktories auf den verschiedenen Host Rechnern
und db-Servern zuweist, was im RELFTAB-File spezifiziert wird, um die Transparenz
zwischen Linux/Unix und Windows in heterogenen Umgebungen zu erhöhen.
- Erweiterung
der cdbFind() und cdbCount() Routinen im einzelnen:
(a) Sowohl cdbFind() als auch cdbCount() können veranlasst werden, einen
“Buffer” mit Datensätzen zurückzugeben. Standardmäßig können so 8
Kilobytes an Datensätzen bei einem Aufruf gepuffert werden; darüberhinaus
kann aber auch die Anzahl der Datensätze für den Puffer in den Argumenten
der erweiterten Routinen vorgegeben werden. Subaufrufe mit cdbCount() können
vorgenommen werden bis end-of-scan erreicht ist.
(b) Bei Setzen eines neu
eingerichteten Flags, kann optional eine Suchoperation ausgelöst werden,
bei der der Status der letzten Suche (des letzten Scans) erhalten bleibt.
D.h. es werden zunächst nur die ersten 10 Datensätze des neuen Scans
retourniert, wobei die folgenden cdb_next(), cdb_previous() etc. Operationen jedoch auf den
alten Scan zurückgreifen.
- Beim
ersten Handshake zwischen einem Client-Programm und einem db-Server wird
festgestellt, ob Client und Server denselben Endian verwenden. Wenn dies
der Fall ist, werden die Daten als kompakter Opaque Data Block anstatt
eines Vielfachen von unterschiedlichen Datentypen transferiert. Dadurch wird die Anzahl der XDR
Aufrufe signifikant reduziert.
- Der alte
ODBC-Treiber „dbq“ wurde durch Erweiterungen an „dbquery“ ersetzt. Der
neue Treiber unterstützt dabei nicht nur ODBC sondern auch native AQL und
SQL Queries. Dies macht die undokumentierte, aber bisher oft genutzte
Funktion aqlexec() überflüssig.
- Eine in
einer älteren Version von db++
kundenspezifisch schon einmal implementierte Optimierung der dbServer „Browse“-Routinen (cdb.next() et al.)
steht jetzt für die Version 8.
allgemein zur Verfügung. Durch eine Vorabmarkierung der Key Positionen
(first, last) wird bei einem unvollständig definierten Constraint
unnötiges sequentielles Suchen gezielt verhindert. Darüberhinaus wird eine
Suche sofort abgebrochen, wenn cdb_setindex() erkennt, dass ein oder
mehrere Suchkriterien mit keinem Spaltennamen matchen. Auch damit werden
große Tabellen nicht unnötig lange bis zum Ende durchsucht.
- Erste
Performancetest mit dem in Zusammenarbeit mit der Parity Software GmbH
entwickelten Programm dbstresser, das eine typische kommerzielle Applikation
simuliert. Dies ist die Basis für das Profiling mit dem begeisternden
„kcachegrind“ Tool. Dabei konnten viele Einsichten für zusätzliche
Performance-Verbesserungen gewonnen werden, insbesondere durch das
Vermeiden von teueren System und Library Calls (allein das Vermeiden von
sprintf()-Aufrufen bringt eine Verbesserung von 10% für den dbServer).
in 2004
- Diverse
kleinere Optimierungen
(a) Benutzung von assembly für string comparison.
(b) Einsatz einer modifizierten Fibonacci-Funktion zur Vermeidung
zeitaufwendiger String-Length-Recalculationen bei jedem Insert, was vor
allem bei multiplen Inserts ins Gewicht fiel. Dass dabei manchmal die
Formatierung mit den db++internen Ouput-Routinen nicht ganz perfekt
ausfällt ist vernachlässigbar, da diese ja in der Regel meist durch
applikationsspezifische Ausgabemöglichkeiten ersetzt werden.
(c) Zusätzlicher Secondary Cache zum schnelleren Auffinden besonders
häufig benötigter Pages der Btrees.
(d) Beim Suchen nach einer Freepage, um dort neue oder modifizierte Daten
einzufügen, begann die Suche bisher am physikalischen Startpunkt des
Tabellenfiles. Ein neuer Algorithmus versucht nun eine Freepage eher in
der Nähe der logischen Umgebung im Btree zu finden. Zudem bewirkt dieser Algorithmus, dass die Daten von
Primär- und Sekundärindizes pysikalisch separiert, d.h. geclustert werden.
- Optimierung
des Matchens innerhalb eines Constraints z.B. von cdb_find(), cdb_next()
et al. durch Unterdrückung von unnötigen getprimarytuple() Calls beim
Scannen eines Sekundärindizes, was in bestimmten Situationen zu einer mehr
als zehnfachen Beschleunigung führen kann.
- Vorsortieren
modifizierter Pages beim Flushen vom Cache zur Festplatte unter
Berücksichtigung der dort vorhandenen physikalischen Ordnung, d.h.
Verwendung von Contigues-Writes
anstatt von Random-Writes. Bei großen Files werden dadurch die
Schreibkopfbewegungen der Plattenspeicher erheblich miniminiert.
- Nutzung
inaktiver Prozessorzeiten (Millisekunden) um gezielt Flushing-Operationen
unabhängig von den Standard-Betriebssystem-Flushes vorab auszulösen und
damit die Prozessorlast besser zu verteilen, steuerbar durch die
Veränderung zweier Tuning-parameter in Abhängigkeit einer gewichteten
Anzahl von Operationen pro Tabelle.
- Bei allen
Optimierungen von 1. bis 4. wurde das von der Firma Parity Software für
Ihre Anwendungen entwickelte Programm dbstresser
eingesetzt um die Wirksamkeit der Maßnahmen nachzuweisen.
- Das
Windows-Client-Programm dbodbc wurde stark überarbeitet, dabei wurden fallweise insuffiziente Query-Operationen und
unerwünschte Interface-Probleme z.B. mit MS-Accesss beseitigt. Ebenso
wurden Probleme, die bei der Verwendung unterschiedlicher
Windows-Versionen insbesondere mit XP auftraten, gelöst.
in 2005
- Abschließende
Arbeiten am integrierten Linux/Windows-Makefilesystem. Es gibt jetzt nur
einen Makefile, sodass nur ein einfaches „make“ für das Kompilieren auf
beiden Plattformen genügt. Darüberhinaus wurde eine
RevisionControl/History-Funktion ins Makefilesystem integriert, sodass
Programme und Libraries über eingebettete Informationen zu Build-Zeitpunkt
und -Nummer, und eine Gliederung nach major, minor und mini Revisions
verfügen.
- Der Large
File Support, der die Verwendung von Tabellen >2GB ermöglicht, ist
jetzt Standard. Die entsprechenden bisherigen Compiler Optionen können
daher entfallen. Dazu wurde ein Set portabler IO-Routinen geschrieben, die
Posix Calls unter Windows mit Hilfe von nativen Windows-IO-Operationen
simulieren. Dies machte auch die Lösung früherer Inkompatiblitäten beim
Locking in heterogenen Umgebungen möglich. Jetzt ist demnach die
gleichzeitige Verwendung von nativen, nfs und samba Mounts möglich.
- Nochmalige
Erweiterung der cdb_find() Routine:
(a) Eine neue Funktion “cdbFindInScan” sucht nach einem spezifischen
Datensatz innerhalb eines existierenden Scans (potentiell innerhalb von
tausenden Datensätzen). Diese Funktion ist besonders nützlich, wenn sie
zusammen mit cdbSavePos() und cdbRestorePos() eingesetzt wird, um zwischen
verschiedenen Positionen innnerhalb eines Scans zu switchen.
(b) Die Funktion cdbFind() versucht
standardmäßig immer den optimalen Index (primär oder sekundär) zu finden
um die Suche zu optimieren. Dies führt dazu, dass schließlich der
resultierende Scan nach dem vom Programm gewählten Index sortiert ist. Ein
neues Argument führt jetzt dazu, dass der Benutzer optional einen
spezifischen Index vorab definieren kann, um zu gewährleisten, dass sein
Scan in einer von ihm gewünschten Sortier-Reihenfolge und nicht der vom Optimiser gewählten präsentiert
wird.
Zur Zeit in Arbeit
- Überarbeitung
der ursprünglich verfügbaren Memo und Blob Fields, sodass diese nicht nur
vom C-Programmierung Interface verfügbar sind, sondern völlig integriert
in alle db++ Tools wie „db“, „dbedit“, „dbfsck“ and „dbodbc“.
- Nach dem
umfangreichen Rewrite in 2004 der ODBC-Client-DLL und nach den Änderungen
am jetztigen ODBC-Server „dbquery“ ist die neue Version von db++ mit
diesen Erweiterungen Gegenstand intesiver Beta-Tests. Darüberhinaus
beinhaltet „dbodbc“ jetzt eine neue Konsolen-Utility „drvsetup“ für das
Installieren und Managen von dbodbc-DLLs und Data Sources (DSNs). Diese
Utility kann nahezu alles, was der Microsoft ODBC-Manager tun kann, aber
von der Konsole aus. Dies wird unseren Partnern das Schreiben von
Installationsskripts für ihre neuen und zukünftigen Kunden bedeutend
erleichtern. Nach Abschluss der Beta-Tests
erfolgt die Auslieferung der Neuen ODBC-Version zunächst über unsere
Partner an ausgewählte Kunden.
- Ein völlig neuer, nicht aus der Literatur
übernommener, Algorithmus zum Sortieren eines kompletten B-trees mit
linearen Sortierzeiten, auch für Tabellen > 2GB bei einem Verbrauch von
< 64 K Hauptspeicher, wird implementiert. Dabei verneinen wir nicht,
dass mit einigen Gigabytes von Hauptspeicher und einem entsprechend hohem
Wert für DB_MAXSORTBUF ein ähnliches Ergebnis erzielt wird. Dieser z.Z.
experimentelle Code wird in Kürze ins aktuelle Release integriert.