Die Version 0.6.0 der Datenbank DuckDB ist jetzt verfügbar. Sie vereint Eigenschaften von SQLite, wie Kompaktheit, die Möglichkeit zur Einbindung als Bibliothek, die Speicherung der Datenbank in einer einzigen Datei und eine benutzerfreundliche CLI-Oberfläche, mit Funktionen und Optimierungen zur Durchführung analytischer Abfragen, die einen signifikanten Teil der gespeicherten Daten abdecken. Dazu gehören beispielsweise die Aggregation aller Inhalte von Tabellen oder das Zusammenführen mehrerer großer Tabellen. Der Quellcode des Projekts wird unter der MIT-Lizenz verbreitet. Die Entwicklung befindet sich noch im Stadium experimenteller Veröffentlichungen, da das Speicherformat noch nicht stabilisiert ist und sich von Version zu Version ändert.
DuckDB bietet einen erweiterten SQL-Dialekt mit zusätzlichen Möglichkeiten zur Verarbeitung sehr komplexer und lang laufender Abfragen. Es werden komplexe Typen (Arrays, Strukturen, Vereinigungen) und die Ausführung beliebiger sowie geschachtelter korrelierender Unterabfragen unterstützt. Mehrere Abfragen können gleichzeitig ausgeführt werden, und Abfragen können direkt aus CSV- und Parquet-Dateien ausgeführt werden. Zudem besteht die Möglichkeit, Daten aus PostgreSQL-Datenbanken zu importieren.
Neben dem Shell-Code von SQLite verwendet das Projekt einen ausgelagerten PostgreSQL-Parser, das Date Math-Komponenten von MonetDB, eine eigene Implementierung von Fensterfunktionen (basierend auf dem Segment Tree Aggregation-Algorithmus), einen regulären Ausdrucks-Processor auf Basis der RE2-Bibliothek, eigene Optimierer für Abfragen, ein MVCC-Verfahren zur Verwaltung der gleichzeitigen Ausführung von Aufgaben (Multi-Version Concurrency Control) sowie eine vektorisierte Abfrageausführungs-Engine, die auf dem Hyper-Pipelining Query Execution-Algorithmus basiert und es ermöglicht, große Datenmengen in einem einzigen Vorgang zu verarbeiten.
Zu den Änderungen in der neuen Version gehören:
- Die Arbeiten zur Verbesserung des Speicherformats wurden fortgesetzt. Ein optimistischer Modus für das Schreiben auf die Festplatte wurde implementiert, bei dem bei der Eingabe einer großen Datenmenge in einer Transaktion die Daten komprimiert und im Streaming-Modus in die Datenbankdatei geschrieben werden, ohne auf die Bestätigung der Transaktion durch den Befehl COMMIT zu warten. Zum Zeitpunkt des Erhalts des COMMIT-Befehls sind die Daten bereits auf der Festplatte gespeichert, und bei der Ausführung von ROLLBACK werden sie verworfen. Zuvor wurden die Daten zunächst vollständig im Speicher gespeichert, und bei einem Commit wurden sie auf die Festplatte geschrieben.
- Die Unterstützung für paralleles Laden von Daten in separate Tabellen wurde hinzugefügt, was die Ladegeschwindigkeit auf Mehrkernsystemen erheblich steigert. Zum Beispiel dauerte im letzten Update das Laden einer DB mit 150 Millionen Zeilen auf einer 10-Kern-CPU 91 Sekunden, während dieser Vorgang in der neuen Version nur noch 17 Sekunden dauert. Es gibt zwei Modi für das parallele Laden – einen mit Erhaltung der Reihenfolge der Datensätze und einen ohne Erhaltung der Reihenfolge.
- Zur Kompression der Daten wird der FSST-Algorithmus (Fast Static Symbol Table) verwendet, der es ermöglicht, Daten innerhalb von Zeichenfolgen zu packen, indem ein gemeinsames Wörterbuch für typische Übereinstimmungen genutzt wird. Die Anwendung des neuen Algorithmus hat die Größe der Testdatenbank von 761 MB auf 251 MB reduziert.
- Für die Kompression von Gleitkommazahlen (DOUBLE und FLOAT) wurden die Algorithmen Chimp und Patas vorgeschlagen. Im Vergleich zum vorher verwendeten Algorithmus Gorillas bietet Chimp ein höheres Kompressionsniveau und eine schnellere Entpackung. Der Algorithmus Patas hat eine geringere Kompression als Chimp, ist jedoch erheblich schneller in der Entpackung, dessen Geschwindigkeit kaum von der der unkomprimierten Daten abweicht.
- Eine experimentelle Funktion zum Hochladen von Daten aus CSV-Dateien in mehreren parallelen Strömen wurde hinzugefügt (SET experimental_parallel_csv=true), was die Ladezeit großer CSV-Dateien erheblich verkürzt. So wurde die Ladezeit einer 720 MB großen CSV-Datei bei aktivierter Option von 3,5 auf 0,6 Sekunden reduziert.
- Die Möglichkeit zur parallelen Ausführung von Operationen zur Erstellung und Verwaltung von Indizes wurde implementiert. So wurde die Ausführungszeit der CREATE INDEX-Operation für eine Spalte mit 16 Millionen Datensätzen von 5,92 auf 1,38 Sekunden verkürzt.
- Es wurde die Parallelisierung von Aggregationsoperationen in Abfragen, die den Ausdruck "COUNT(DISTINCT col)" enthalten, sichergestellt.
- In SQL wurde der Typ UNION hinzugefügt, der die Bindung an mehrere Typen für ein Element zulässt (z. B. "UNION(num INT, error VARCHAR)").
- In SQL wurde die Möglichkeit eingeführt, Abfragen zu formulieren, die mit dem Wort "FROM" anstelle von "SELECT" beginnen. In diesem Fall wird davon ausgegangen, dass die Abfrage mit "SELECT *" beginnt.
- In SQL wurde die Unterstützung des Ausdrucks 'COLUMNS' eingeführt, mit dem Sie Operationen an mehreren Spalten ohne Duplizierung des Ausdrucks ausführen können. Beispielsweise führt 'SELECT MIN(COLUMNS(*)) FROM obs;' die MIN-Funktion für jede Spalte in der Tabelle obs aus, während 'SELECT COLUMNS('val[0-9]+') FROM obs;' für Spalten mit Namen, die aus 'val' und Ziffern bestehen, verwendet wird.
- Es wurde die Unterstützung für Operationen mit Listen hinzugefügt, beispielsweise 'SELECT [x + 1 FOR x IN [1, 2, 3]] AS l;'.
- Die Speichernutzung wurde optimiert. Standardmäßig wird auf der Linux-Plattform die Bibliothek jemalloc zur Speicherverwaltung verwendet. Die Leistung von Hash-Join-Operationen wurde bei begrenztem Speicherplatz erheblich verbessert.
- In der Befehlszeilenschnittstelle wurde der Ausgabemodus '.mode duckbox' hinzugefügt, der mittlere Spalten unter Berücksichtigung der Fensterbreite des Terminals ausblendet (geeignet für eine schnelle visuelle Bewertung von Abfrageergebnissen mit einer großen Anzahl von Spalten, wie 'SELECT * FROM tbl', die normalerweise auf mehrere Zeilen verteilt werden). Mit dem Parameter '.maxrows X' kann zusätzlich die Anzahl der angezeigten Zeilen eingeschränkt werden.
- Im CLI wird kontextabhängige Eingabeautovervollständigung bereitgestellt (Vervollständigung von Schlüsselwörtern, Tabellennamen, Funktionen, Spaltennamen und Dateinamen).
- Im CLI ist standardmäßig die Anzeige eines Fortschrittsbalkens für Abfragen aktiviert.
Quelle: opennet.ru
