DuckDB 0.6.0 wurde veröffentlicht, eine SQLite-Variante für analytische Abfragen.

Die Version 0.6.0 der Datenbank DuckDB ist verfügbar und kombiniert Eigenschaften von SQLite, wie Kompaktheit, die Möglichkeit der Einbindung als eingebettete Bibliothek, die Speicherung der Datenbank in einer Datei und eine benutzerfreundliche CLI-Schnittstelle, mit Werkzeugen und Optimierungen für die Durchführung analytischer Abfragen, die einen signifikanten Teil der gespeicherten Daten abdecken, beispielsweise Aggregation des gesamten Inhalts von Tabellen oder das Zusammenführen mehrerer großer Tabellen. Der Code des Projekts wird unter der MIT-Lizenz veröffentlicht. Die Entwicklung befindet sich derzeit in der Phase von experimentellen Versionen, da das Speicherformat noch nicht stabilisiert ist und sich von Version zu Version ändert.

DuckDB bietet einen erweiterten Dialekt der SQL-Sprache, der zusätzliche Möglichkeiten zur Verarbeitung von sehr komplexen und langanhaltenden Abfragen umfasst. Die Verwendung komplexer Typen (Arrays, Strukturen, Vereinigungen) sowie die Möglichkeit der Ausführung von beliebigen und geschachtelten korrelierenden Unterabfragen wird unterstützt. Gleichzeitig können mehrere Abfragen ausgeführt werden, und Abfragen können direkt aus CSV- und Parquet-Dateien ausgeführt werden. Der Import aus DBMS PostgreSQL ist möglich.

Neben dem Shell-Code von SQLite verwendet das Projekt einen ausgelagerten Parser von PostgreSQL, die Komponente Date Math von MonetDB, eine eigene Implementierung von Fensterfunktionen (basierend auf dem Algorithmus der Segmentbaum-Aggregation), einen Regex-Handler auf Basis der Bibliothek RE2, eigene Abfrageoptimierer, ein MVCC-Mechanismus zur Verwaltung von paralleler Aufgabenausführung (Multi-Version Concurrency Control) sowie eine vektorisierte Abfrageausführungsmaschine basierend auf dem Algorithmus der Hyper-Pipelining-Abfrageausführung, die es ermöglicht, große Datenmengen in einer einzigen Operation gleichzeitig zu verarbeiten.

Zu den Änderungen in der neuen Version gehören:

  • Die Arbeiten zur Verbesserung des Speicherformats werden fortgesetzt. Ein optimistischer Schreibmodus wurde implementiert, bei dem beim Laden eines großen Datensatzes in einer Transaktion die Daten komprimiert und im Streaming-Modus in die Datei der Datenbank geschrieben werden, ohne auf den Abschluss der Bestätigung der Transaktion durch den Befehl COMMIT zu warten. Bei Erteilung des Befehls COMMIT sind die Daten bereits auf der Festplatte gespeichert, während sie bei einem ROLLBACK verworfen werden. Zuvor wurden die Daten zuerst vollständig im Speicher gesichert, bevor sie beim Commit auf die Festplatte geschrieben wurden.
  • Die Unterstützung für paralleles Laden von Daten in separate Tabellen wurde hinzugefügt, was die Ladegeschwindigkeit auf Mehrkernsystemen erheblich erhöht. Zum Beispiel dauerte im vorherigen Release das Laden einer Datenbank mit 150 Millionen Zeilen auf einer 10-Kern-CPU 91 Sekunden, während dies in der neuen Version in 17 Sekunden erfolgt. Es sind zwei Modi für das parallele Laden vorgesehen – mit und ohne Beibehaltung der Reihenfolge der Einträge.
  • Zur Datenkompression wird der Algorithmus FSST (Fast Static Symbol Table) eingesetzt, der es ermöglicht, Daten innerhalb von Strings unter Verwendung eines gemeinsamen Wörterbuchs typischer Übereinstimmungen zu packen. Der Einsatz des neuen Algorithmus hat die Größe der Testdatenbank von 761 MB auf 251 MB reduziert.
  • Zur Kompression von Gleitpunktzahlen (DOUBLE und FLOAT) werden die Algorithmen Chimp und Patas vorgeschlagen. Im Vergleich zum zuvor verwendeten Algorithmus Gorillas bietet Chimp ein höheres Kompressionsniveau und eine schnellere Dekompression. Der Algorithmus Patas liegt in Bezug auf die Kompressionsrate hinter Chimp zurück, ist jedoch deutlich schneller in der Dekompression, die nahezu die gleiche Geschwindigkeit wie das Lesen unkomprimierter Daten aufweist.
  • Eine experimentelle Möglichkeit zum Hochladen von Daten aus CSV-Dateien in mehreren parallelen Threads (SET experimental_parallel_csv=true) wurde hinzugefügt, was die Ladezeit großer CSV-Dateien erheblich verkürzt. Beispielsweise wurde bei aktivierter Option die Ladezeit einer CSV-Datei mit einer Größe von 720 MB von 3,5 auf 0,6 Sekunden reduziert.
  • Die parallele Ausführung von Operationen zum Erstellen und Verwalten von Indizes wurde implementiert. Beispielsweise wurde die Ausführungszeit der Operation CREATE INDEX für eine Spalte mit 16 Millionen Datensätzen von 5,92 auf 1,38 Sekunden verkürzt.
  • Die Parallelisierung von Aggregatoperationen in Abfragen, die den Ausdruck „COUNT(DISTINCT col)“ enthalten, wurde sichergestellt.
  • Die Unterstützung des Typs UNION wurde in SQL hinzugefügt, die eine Bindung an ein Element mehrerer Typen ermöglicht (z. B. „UNION(num INT, error VARCHAR)“).
  • In SQL wurde die Möglichkeit geschaffen, Abfragen zu formulieren, die mit dem Wort „FROM“ anstelle von „SELECT“ beginnen. In diesem Fall wird angenommen, dass die Abfrage mit „SELECT *“ beginnt.
  • Die Unterstützung des Ausdrucks „COLUMNS“ wurde in SQL hinzugefügt, was die Durchführung von Operationen über mehrere Spalten ohne Duplizierung des Ausdrucks ermöglicht. Zum Beispiel 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, bestehend aus „val“ und Ziffern, gilt.
  • Die Unterstützung von Operationen über Listen wurde hinzugefügt, zum Beispiel „SELECT [x + 1 for x in [1, 2, 3]] AS l;“.
  • Der Speicherverbrauch wurde optimiert. Standardmäßig wird auf der Linux-Plattform die jemalloc-Bibliothek für das Speichermanagement eingesetzt. Die Leistung von Hash-Vereinigung-Operationen wurde bei begrenzter Speicherkapazität erheblich verbessert.
  • Im Befehlszeilen-Interface wurde der Ausgabemodus „.mode duckbox“ hinzugefügt, der mittlere Spalten in Abhängigkeit von der Breite des Terminalfensters ausblendet (geeignet zur schnellen visuellen Beurteilung von Abfrageergebnissen mit einer großen Anzahl von Spalten, wie „SELECT * FROM tbl“, die im normalen Modus auf mehrere Zeilen erweitert werden). Mit dem Parameter „.maxrows X“ kann zusätzlich die Anzahl der ausgegebenen Zeilen begrenzt werden.
  • Im CLI wurde die kontextbezogene Auto-Vervollständigung der Eingabe sichergestellt (Vervollständigung von Schlüsselwörtern, Tabellennamen, Funktionen, Spaltennamen und Dateinamen).
  • Die Anzeige eines Fortschrittsbalkens für die Abfrageausführung ist standardmäßig im CLI aktiviert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4