È stata pubblicata la versione 1.4.0 del database DuckDB, progettato per l'esecuzione di query analitiche e concettualmente simile a SQLite. DuckDB combina proprietà di SQLite come compattezza, integrazione come libreria, archiviazione del database in un unico file e interfaccia a riga di comando, con funzionalità e ottimizzazioni per eseguire query analitiche che coinvolgono una parte significativa dei dati memorizzati, ad esempio, eseguendo l'aggregazione di tutto il contenuto delle tabelle o la fusione di più tabelle di grandi dimensioni. Il codice del progetto è scritto in C++ e distribuito sotto 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 aggiunta la supporto per la memorizzazione dei file del database in forma crittografata. Per la crittografia viene utilizzato l'algoritmo AES-256 in modalità GCM. Viene crittografato non solo il file principale dei dati, ma anche i log WAL e i file temporanei. Le chiavi per la crittografia del database sono impostate con il comando ATTACH tramite il parametro ENCRYPTION_KEY. ATTACH ‘encrypted.db’ AS enc_db (ENCRYPTION_KEY ‘quack_quack’);
- È stata aggiunta la supporto per il comando «MERGE INTO», che può essere utilizzato come alternativa all'espressione «INSERT … ON CONFLICT», non richiede una chiave primaria e funziona con condizioni di fusione arbitrarie. Il comando «MERGE INTO» consente di creare espressioni SQL condizionali che combinano in un'unica espressione operazioni di INSERT, UPDATE e DELETE. Ad esempio, con MERGE è possibile organizzare la fusione di due tabelle, inserendo i record mancanti e aggiornando quelli esistenti. WITH deletes(item_id, delete_threshold) AS (VALUES (10, 3000)) MERGE INTO Stock USING deletes USING (item_id) WHEN MATCHED AND balance < delete_threshold THEN DELETE RETURNING merge_action, *;
- In aggiunta, per lavorare con tabelle nel formato Apache Iceberg, è stata aggiunta la supporto per operazioni di scrittura (in precedenza era supportata solo la lettura), il che consente di trasferire dati da Iceberg a DuckDB e viceversa.
- Nel client della riga di comando è stato aggiunto un indicatore di progresso per l'esecuzione dell'operazione con una previsione del tempo rimanente fino al completamento.
- È stata aggiunta la funzione finestra «FILL», che può essere utilizzata per interpolare valori mancanti in finestre ordinate. FROM (VALUES (1, 1), (2, NULL), (3, 42)) t(c1, c2) SELECT fill(c2) OVER (ORDER BY c1) f; 1 21 42
- È stato implementato il componente aggiuntivo Teradata Connector per la connessione ai database Teradata. Il componente consente di manipolare tabelle, eseguire query e lanciare comandi SQL direttamente in Teradata, utilizzando DuckDB.
- È stato aggiunto il supporto per il checkpointing delle tabelle memorizzate in memoria, che ha reso possibile implementare il supporto per la compressione. Inoltre, durante il checkpointing viene eseguita una pulizia delle righe eliminate e un rilascio dello spazio dopo le operazioni di cancellazione. ATTACH ‘:memory:’ AS memory_compressed (COMPRESS);
- Sono state proposte diverse ottimizzazioni delle prestazioni: l'implementazione dell'ordinamento è stata trasferita all'uso dell'algoritmo di fusione k-way, che riduce il movimento dei dati. Le espressioni di tabella comuni (Common Table Expression, CTE) ora vengono materializzate per impostazione predefinita.
Fonte: opennet.ru
