È disponibile il rilascio del DBMS DuckDB 0.6.0, che combina caratteristiche di SQLite come compattezza, possibilità di integrazione come libreria embedded, archiviazione del database in un unico file e un'interfaccia CLI user-friendly, con strumenti e ottimizzazioni per l'esecuzione di query analitiche che coprono una parte significativa dei dati memorizzati, come l'aggregazione del contenuto dell'intera tabella o la fusione di più tabelle di grandi dimensioni. Il codice del progetto è distribuito con licenza MIT. Sviluppo attualmente in fase di formazione delle versioni sperimentali, poiché il formato di archiviazione non è ancora stabilizzato e cambia da versione a versione.
DuckDB offre un dialetto SQL esteso che include funzionalità aggiuntive per gestire query molto complesse e lunghe. Supporta l'utilizzo di tipi complessi (array, strutture, unioni) e la possibilità di eseguire sottoparole correlate arbitrarie e annidate. È possibile eseguire più query contemporaneamente, eseguire query direttamente da file in formato CSV e Parquet. È disponibile la funzione di importazione da database PostgreSQL.
Oltre al codice shell di SQLite, il progetto utilizza un parser estratto in una libreria a parte di PostgreSQL, il componente Date Math di MonetDB, una propria implementazione delle funzioni di finestra (basata sull'algoritmo Segment Tree Aggregation), un gestore di espressioni regolari basato sulla libreria RE2, un ottimizzatore di query proprietario, un meccanismo MVCC per la gestione della concorrenza nelle operazioni (Multi-Version Concurrency Control) e un motore di esecuzione delle query vettorizzato basato sull'algoritmo Hyper-Pipelining Query Execution, che consente di elaborare grandi insiemi di valori in un'unica operazione.
Tra le novità della nuova versione:
- È proseguito il lavoro per migliorare il formato di archiviazione. È stata implementata una modalità di scrittura ottimistica su disco, nella quale, durante il caricamento di un grande insieme di dati in una singola transazione, i dati vengono compressi e scritti in modo continuo nel file del database, senza attendere il completamento della conferma della transazione tramite il comando COMMIT. Al momento dell'invio del comando COMMIT, i dati sono già stati scritti su disco, mentre in caso di ROLLBACK vengono scartati. In precedenza, i dati venivano prima salvati completamente in memoria e poi scritti su disco al momento del commit.
- È stato aggiunto il supporto per il caricamento parallelo dei dati in tabelle separate, il che consente di aumentare notevolmente la velocità di caricamento sui sistemi multi-core. Ad esempio, nella versione precedente, il caricamento di un database con 150 milioni di righe su un CPU a 10 core richiedeva 91 secondi, mentre nella nuova versione questa operazione viene completata in 17 secondi. Sono previsti due modalità di caricamento parallelo: con mantenimento dell'ordine delle registrazioni e senza mantenimento dell'ordine.
- Per la compressione dei dati è stato utilizzato l'algoritmo FSST (Fast Static Symbol Table), che consente di imballare i dati all'interno delle stringhe utilizzando un dizionario comune di corrispondenze tipiche. L'uso di questo nuovo algoritmo ha permesso di ridurre le dimensioni del database di prova da 761MB a 251MB.
- Per la compressione dei numeri in virgola mobile (DOUBLE e FLOAT) sono stati proposti gli algoritmi Chimp e Patas. Rispetto all'algoritmo Gorillas precedentemente utilizzato, Chimp offre un livello di compressione superiore e una decompressione più veloce. L'algoritmo Patas è inferiore a Chimp in termini di compressione, ma è significativamente più rapido nella decompressione, quasi al pari della lettura dei dati non compressi.
- È stata aggiunta un'opzione sperimentale per il caricamento dei dati da file CSV in più thread paralleli (SET experimental_parallel_csv=true), che riduce notevolmente il tempo di caricamento di grandi file CSV. Ad esempio, attivando questa opzione, il tempo di caricamento di un file CSV di 720 MB è stato ridotto da 3,5 a 0,6 secondi.
- È stata implementata la possibilità di eseguire operazioni di creazione e gestione degli indici in parallelo. Ad esempio, l'esecuzione dell'operazione CREATE INDEX per una colonna con 16 milioni di record è stata ridotta da 5,92 a 1,38 secondi.
- È stata garantita la parallelizzazione delle operazioni di aggregazione nelle query contenenti l'espressione «COUNT(DISTINCT col)».
- In SQL è stata aggiunta la supporto per il tipo UNION, che consente l'associazione di più tipi a un singolo elemento (ad esempio, «UNION(num INT, error VARCHAR)»).
- In SQL è stata introdotta la possibilità di formare query che iniziano con la parola «FROM» invece di «SELECT». In questo caso, si presume che la query inizi con «SELECT *».
- In SQL è stata aggiunta la supporto per l'espressione «COLUMNS», che permette di eseguire operazioni su più colonne senza duplicare l'espressione. Ad esempio, «SELECT MIN(COLUMNS(*)) from obs;» eseguirà la funzione MIN per ogni colonna nella tabella obs, mentre «SELECT COLUMNS(‘val[0-9]+’) from obs;» per le colonne con nomi composti da «val» e numeri.
- È stata aggiunta la supporto per operazioni su liste, ad esempio, «SELECT [x + 1 for x in [1, 2, 3]] AS l;».
- È stata ottimizzata l'allocazione della memoria. Di default, sulla piattaforma Linux, viene utilizzata la libreria jemalloc per la gestione della memoria. È stata notevolmente migliorata la performance delle operazioni di unione delle hash in condizioni di memoria limitata.
- Nell'interfaccia a riga di comando è stata aggiunta la modalità di output «.mode duckbox», che scarta le colonne intermedie tenendo conto della larghezza della finestra del terminale (ideale per una rapida valutazione visiva dei risultati di query con molte colonne, come «SELECT * FROM tbl», che in modalità normale si allargano su più righe). Con il parametro «.maxrows X» è inoltre possibile limitare il numero di righe visualizzate.
- Nel CLI è stata implementata la funzione di completamento automatico dell'input in base al contesto (completa l'input di parole chiave, nomi di tabelle, funzioni, nomi di colonne e nomi di file).
- Nel CLI è abilitata di default la visualizzazione di un indicatore di progresso per l'esecuzione della query.
Fonte: opennet.ru
