Release der Datenbank DuckDB 1.2.0

Die Version der Datenbank DuckDB 1.2.0, die auf die Ausführung analytischer Abfragen ausgerichtet ist und konzeptionell an SQLite erinnert, wurde veröffentlicht. DuckDB vereint Eigenschaften von SQLite, wie Kompaktheit, die Verwendung als eingebettete Bibliothek, Speicherung der Datenbank in einer einzigen Datei und ein CLI-Interface, mit Funktionen und Optimierungen zur Ausführung analytischer Abfragen, die einen erheblichen Teil der gespeicherten Daten abdecken, etwa die Aggregation des gesamten Inhalts von Tabellen oder das Zusammenführen mehrerer großer Tabellen. Der Projektcode ist in C++ geschrieben und wird unter der MIT-Lizenz veröffentlicht.

DuckDB bietet einen erweiterten SQL-Dialekt, der zusätzliche Möglichkeiten für die Verarbeitung sehr komplexer und langwieriger Abfragen umfasst. Es ist möglich, komplexe Typen (Arrays, Strukturen, Vereinigungen) zu verwenden, sowie beliebige und verschachtelte, korrelierende Unterabfragen auszuführen. Es wird die gleichzeitige Ausführung mehrerer Abfragen unterstützt, sowie die Ausführung von Abfragen direkt aus Dateien im CSV- und Parquet-Format. Der Import aus der PostgreSQL-Datenbank wird ebenfalls unterstützt.

Das Projekt verwendet eine Shell von SQLite, einen Parser von PostgreSQL, die Date Math-Komponente von MonetDB, eine eigene Implementierung von Fensterfunktionen (basierend auf dem Segmentbaumaggregationsalgorithmus), einen regulären Ausdruck-Handler auf Basis der RE2-Bibliothek, einen eigenen Abfrageoptimierer, einen MVCC-Mechanismus zur Verwaltung der gleichzeitigen Ausführung von Aufgaben (Multi-Version Concurrency Control) sowie eine vektorisierte Abfragedurchführungsengine, die auf dem Hyper-Pipelining-Abfrageausführungsalgorithmus basiert und es ermöglicht, große Mengen an Werten in einem einzigen Vorgang zu verarbeiten.

In der neuen Version:

  • Die Unterstützung neuer Komprimierungsmethoden wurde implementiert, die standardmäßig nicht aktiviert sind, um die Kompatibilität der Datenbankdateien mit früheren Versionen von DuckDB zu gewährleisten. Um das verbesserte Format der Datenbankdateien zu verwenden, wurde die Möglichkeit vorgeschlagen, die Datenbank an die Versionsnummer zu binden – beim Öffnen der Datei kann nun der Parameter „STORAGE_VERSION“ verwendet werden, um die minimal unterstützte Datenbankversion anzugeben („ATTACH ‘file.db’ (STORAGE_VERSION ‘v1.2.0’);“). Zur Umwandlung des neuen Formats in das alte kann der SQL-Befehl COPY verwendet werden, zum Beispiel: ATTACH ‘file1.db’; ATTACH ‘converted_file.db’ (STORAGE_VERSION ‘v1.0.0’); COPY FROM DATABASE file1 TO converted_file;
  • Die Unterstützung des SQL-Befehls „ALTER TABLE … ADD PRIMARY KEY“ wurde hinzugefügt, um einen Primärschlüssel zu einer bestehenden Tabelle hinzuzufügen.
  • Die Beschränkung, die das wiederholte Hinzufügen von Identifikatoren, für die ein eindeutiger Verfolgungsindex vorhanden ist, verhindert hat, wurde aufgehoben, sofern diese Identifikatoren in der aktuellen Transaktion gelöscht wurden. Beispielsweise führt der untenstehende SQL-Code jetzt nicht mehr zu einem Fehler: CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR); INSERT INTO students VALUES (1, 'John Doe'); BEGIN; DELETE FROM students WHERE id = 1; INSERT INTO students VALUES (1, 'Jane Doe');
  • Die Unterstützung für den Import von CSV-Dateien im Latin-1- und UTF-16-Encoding wurde hinzugefügt (bisher wurde nur UTF-8 unterstützt). FROM read_csv('cities-latin-1.csv', encoding = 'latin-1');
  • Jetzt können in CSV-Dateien mehrbyteige Trennzeichen (bis zu 4 Byte) verwendet werden, die es ermöglichen, Emojis als Spaltentrennzeichen anzugeben. a🦆b hello🦆world FROM read_csv('example.dsv', sep = '🦆');
  • Der strenge Modus für das Parsen von CSV-Dateien ist standardmäßig aktiviert ('strict_mode = true') und überprüft die Einhaltung der Formatierung gemäß der Spezifikation RFC 4180. Im strengen Modus darf nur ein Zeichen zur Zeilentrennung verwendet werden, was zu einem Fehler führen wird, wenn in den Dateien zur Zeilentrennung nicht nur das Zeilenumbruchzeichen, sondern auch das Wagenrücklaufzeichen ('\r\n') verwendet wird.
  • Im CSV-Parser wurde ein neuer Algorithmus zur Erkennung von neuen Zeilen implementiert, der die Parallelisierung von Operationen unterstützt. Die Verwendung des neuen Algorithmus hat das Parsen von CSV um etwa 15 % beschleunigt.
  • Die Beschränkung der Zeilenlänge in CSV-Dateien wurde aufgehoben (bisher durfte eine Zeile 8 MB nicht überschreiten).
  • Bei der Exportierung von Daten im Parquet-Format wurde die Unterstützung für Hashes (Dictionaries) und Indizes auf Basis des Bloom-Filters implementiert. Eine Kompressionsmethode namens DELTA_BINARY_PACKED wurde implementiert, die die Größe von Parquet-Dateien erheblich reduziert.
  • Der Befehlszeilen-Interface hat einen Sicherheitsmodus erhalten, der durch die Option '-safe' oder den Befehl '.safe_mode' aktiviert werden kann. In diesem Modus wird der Zugriff nur auf die ursprünglich angegebene Datenbankdatei erlaubt, und der Versuch, andere Dateien zu öffnen, führt zu einer Fehlermeldung.
  • Im Befehlszeilen-Interface wurde die Eingabe-Autovervollständigung verbessert. Der Code für die Autovervollständigung wurde auf die Verwendung von PEG (Parsing Expression Grammar) umgestellt.
  • Bei der Ausführung von Befehlen im Befehlszeilen-Interface wird eine anschauliche Darstellung großer Zahlen umgesetzt, zum Beispiel wird bei der Darstellung der Zahl 100000000 zusätzlich '(100 Millionen)' angehängt.
  • In SQL wurde die Unterstützung für eine Syntax hinzugefügt, bei der abgekürzte Tabellen- und Ausdrucksnamen vor den Werten angegeben werden können, auf die sie verweisen (anstatt die Syntax „Ausdruck AS Name“ zu verwenden): SELECT e1: some_long_and_winding_expression, e2: t2.a_column_name FROM t1: long_schema.some_long_table_name, t2: short_s.tbl;
  • Die SELECT-Anweisung unterstützt nun die Operation „RENAME“, um Felder umzubenennen, die bei der Angabe des Ausdrucks „*“ angezeigt werden: SELECT * RENAME (col1 AS new_col1) FROM integers;
  • In der SELECT-Anweisung ist die Verwendung der Operationen „LIKE“ und „SIMILAR TO“ beim Abruf über „*“ erlaubt: SELECT * LIKE ‘val%’ FROM key_val;
  • Die Qualität der Generierung von Pseudorandomzahlen wurde verbessert.
  • Der Abfrageoptimierer wurde modernisiert. Die Leistung beim Test TPC-H SF100 hat sich um 13 % erhöht.
  • Eine neue C-ähnliche API für die Entwicklung von Erweiterungen wurde vorgeschlagen, die beispielsweise zur Erstellung neuer Aggregat- oder Tabellenfunktionen verwendet werden kann.
  • Die Unterstützung für Systeme mit der Standard-C-Bibliothek Musl wurde hinzugefügt.

Quelle: opennet.ru

60GB SSD 8Gb DDR4