È stata pubblicata la versione 1.2.0 del database DuckDB, progettato per eseguire query analitiche e concettualmente simile a SQLite. DuckDB combina proprietà di SQLite come compattezza, connessione come libreria integrata, archiviazione del database in un unico file e interfaccia CLI, con funzionalità e ottimizzazioni per eseguire query analitiche su una parte significativa dei dati memorizzati, ad esempio, eseguendo aggregazioni su tutto il contenuto delle tabelle o unendo più grandi tabelle. Il codice del progetto è scritto in C++ e viene distribuito con licenza MIT.
DuckDB offre un dialetto esteso del linguaggio SQL, che include funzionalità aggiuntive per la gestione di query molto complesse e prolungate. Supporta tipi complessi (array, strutture, unioni) e consente l'esecuzione di sottoquery correlate arbitrari e nidificate. È possibile eseguire più query simultaneamente e inviare query direttamente da file nei formati CSV e Parquet. È supportato l'import di dati da database PostgreSQL.
Il progetto utilizza un'interfaccia basata su SQLite, un parser di PostgreSQL, il componente Date Math di MonetDB, la propria implementazione delle funzioni di finestra (basata sull'algoritmo Segment Tree Aggregation), un gestore delle espressioni regolari basato sulla libreria RE2, ottimizzatore delle query personalizzato, meccanismo MVCC per la gestione della concorrenza (Multi-Version Concurrency Control), e un motore di esecuzione delle query vettorizzato basato sull'algoritmo Hyper-Pipelining Query Execution, che consente di elaborare grandi set di valori con un'unica operazione.
Nella nuova versione:
- È stata implementata la supporto per nuovi metodi di compressione, che non sono abilitati per impostazione predefinita per mantenere la compatibilità dei file DB con le versioni precedenti di DuckDB. Per utilizzare il formato migliorato dei file DB, è stata proposta la possibilità di associare il DB a un numero di versione: aprendo il file con il parametro "STORAGE_VERSION" ora è possibile specificare la versione minima supportata del DB ("ATTACH ‘file.db’ (STORAGE_VERSION ‘v1.2.0’);"). Per convertire il nuovo formato in uno più vecchio si può usare il comando SQL COPY, ad esempio: ATTACH ‘file1.db’; ATTACH ‘converted_file.db’ (STORAGE_VERSION ‘v1.0.0’); COPY FROM DATABASE file1 TO converted_file;
- Aggiunta la supporto per il comando SQL "ALTER TABLE … ADD PRIMARY KEY" per aggiungere una chiave primaria a una tabella esistente.
- Rimossa la limitazione che impediva di riaggiungere identificatori per i quali esiste un indice di tracciamento dell'unicità, se tali identificatori erano stati eliminati nella transazione corrente. Ad esempio, il seguente codice SQL ora non genera errori: 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’);
- È stata aggiunta la supporto per il caricamento di file CSV nelle codifiche Latin-1 e UTF-16 (in precedenza era supportata solo la codifica UTF-8). FROM read_csv(‘cities-latin-1.csv’, encoding = ‘latin-1’);
- È stata aggiunta la supporto per l'utilizzo di delimitatori multibyte nei file CSV (fino a 4 byte), consentendo di utilizzare emoji come delimitatori di colonna. a🦆b hello🦆world FROM read_csv(‘example.dsv’, sep = ‘🦆’);
- Per impostazione predefinita, è attivata la modalità rigorosa per l'analisi dei file CSV (‘strict_mode = true’), che verifica la conformità alla formattazione della specifica RFC 4180. In modalità rigorosa è consentito utilizzare solo un carattere per separare le righe, il che genererà un errore nel tentativo di analizzare file in cui le righe sono separate non solo dal carattere di nuova linea, ma anche dal ritorno a capo (‘\r\n’).
- Nel parser CSV è stato implementato un nuovo algoritmo per la determinazione delle nuove righe, che supporta la parallelizzazione delle operazioni. L'uso del nuovo algoritmo ha accelerato l'analisi dei CSV di circa il 15%.
- Rimosso il limite della dimensione della riga nei file CSV (in precedenza, la riga non doveva superare 8 MB).
- Nell'esportazione dei dati nel formato Parquet è stata implementata la supporto per gli hash (dictionary) e gli indici basati su filtri di Bloom. È stato implementato un metodo di compressione DELTA_BINARY_PACKED, che consente di ridurre notevolmente le dimensioni dei file Parquet.
- Nell'interfaccia della riga di comando è stata aggiunta una modalità sicura, attivabile tramite l'opzione «-safe» o il comando «.safe_mode». In questa modalità è consentito l'accesso solo al file DB specificato inizialmente, mentre il tentativo di aprire altri file porterà a un errore.
- Nell'interfaccia della riga di comando è stato migliorato il completamento automatico dell'input. Il codice per il completamento automatico è stato adattato per utilizzare PEG (Parsing Expression Grammar).
- Durante l'esecuzione dei comandi nell'interfaccia della riga di comando è stata implementata una visualizzazione chiara dei numeri grandi; ad esempio, quando viene visualizzato il numero 100000000, verrà aggiunto «(100 milioni)».
- In SQL è stata aggiunta la supporto per una sintassi che consente di fornire riferimenti abbreviati a tabelle e espressioni prima dei valori ai quali si riferiscono (invece di utilizzare la sintassi «espressione AS nome»): SELECT e1: some_long_and_winding_expression, e2: t2.a_column_name FROM t1: long_schema.some_long_table_name, t2: short_s.tbl;
- Nel comando «SELECT» è stata implementata la supporto per l'operazione «RENAME» per rinominare i campi specificati nell'espressione «*»: SELECT * RENAME (col1 AS new_col1) FROM integers;
- Nel comando «SELECT» è permesso l'uso delle operazioni «LIKE» e «SIMILAR TO» quando si utilizza «*»: SELECT * LIKE ‘val%’ FROM key_val;
- Aumentata la qualità della generazione di numeri pseudo-casuali.
- Ottimizzatore delle query aggiornato. Le prestazioni nel test TPC-H SF100 sono aumentate del 13%.
- Proposto un nuovo API simile al C per lo sviluppo di estensioni, utilizzabile per creare nuove funzioni aggregate o di tabella.
- Aggiunta la supporto per i sistemi con la libreria C standard Musl.
Fonte: opennet.ru
