È disponibile il rilascio del DBMS DuckDB 0.6.0, che combina proprietà di SQLite come compattezza, possibilità di integrare librerie, archiviazione del database in un singolo file e un'interfaccia CLI user-friendly, con strumenti e ottimizzazioni per eseguire query analitiche che coprono una parte significativa dei dati memorizzati, come l'aggreazione di tutto il contenuto delle tabelle o la fusione di più tabelle grandi. Il codice del progetto è distribuito sotto licenza MIT. Lo sviluppo è ancora in fase di formazione di versioni sperimentali, poiché il formato di archiviazione non è ancora stabilizzato e cambia da una versione all'altra.
DuckDB offre un'estensione del linguaggio SQL, includendo funzionalità aggiuntive per l'elaborazione di query molto complesse e a lungo termine. È supportato l'uso di tipi complessi (array, strutture, unioni) e la possibilità di eseguire sottoquery correlate arbitrarie e nidificate. È consentito l'esecuzione simultanea di più query, l'esecuzione di query direttamente da file in formato CSV e Parquet. È disponibile la possibilità di importare da DBMS PostgreSQL.
Oltre al codice shell di SQLite, il progetto utilizza un parser estratto in una libreria separata da PostgreSQL, il componente Date Math da MonetDB, la propria implementazione delle funzioni di finestra (basata sull'algoritmo Segment Tree Aggregation), un gestore di espressioni regolari basato sulla libreria RE2, il proprio ottimizzatore di query, il meccanismo MVCC per la gestione della concorrenza (Multi-Version Concurrency Control), e anche 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à del nuovo rilascio:
- È proseguito il lavoro per migliorare il formato di archiviazione. È stata implementata una modalità di scrittura ottimista su disco, in cui, durante il caricamento di un grande set di dati in una singola transazione, i dati vengono compressi e scritti in modalità streaming in un file del database, senza attendere il completamento della conferma della transazione con il comando COMMIT. Al momento dell'invio del comando COMMIT, i dati risultano già scritti su disco, mentre durante l'esecuzione del ROLLBACK vengono scartati. In precedenza, i dati venivano prima completamente salvati in memoria e poi scritti su disco al momento del commit.
- È stata aggiunta la supporto per il caricamento parallelo dei dati in tabelle separate, che consente di aumentare notevolmente la velocità di caricamento su sistemi multicore. Ad esempio, nella versione precedente, il caricamento del database con 150 milioni di righe su una CPU a 10 core richiedeva 91 secondi, mentre nella nuova versione questa operazione viene completata in 17 secondi. Sono previste due modalità di caricamento parallelo: con mantenimento dell'ordine delle righe 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 righe sfruttando un dizionario comune di corrispondenze tipiche. L'uso del nuovo algoritmo ha permesso di ridurre la dimensione del database di prova da 761 MB a 251 MB.
- 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 più elevato e una decompressione più rapida. L'algoritmo Patas è inferiore a Chimp in termini di compressione, ma è notevolmente più veloce nella decompressione, che è quasi equivalente alla lettura di dati non compressi.
- È stata implementata una funzionalità sperimentale per il caricamento di dati da file CSV in più flussi paralleli (SET experimental_parallel_csv=true), che riduce in modo significativo il tempo di caricamento di grandi file CSV. Ad esempio, attivando l'opzione, il tempo di caricamento di un file CSV da 720 MB è sceso da 3,5 a 0,6 secondi.
- È stata realizzata la possibilità di eseguire in parallelo le operazioni di creazione e gestione degli indici. Ad esempio, l'esecuzione dell'operazione CREATE INDEX per una colonna con 16 milioni di righe è scesa da 5,92 a 1,38 secondi.
- È stata garantita la parallelizzazione delle operazioni di aggregazione nelle query che contengono l'espressione 'COUNT(DISTINCT col)'.
- In SQL è stata aggiunta la supporto per il tipo UNION, che consente la legatura a un singolo elemento di più tipi (ad esempio, «UNION(num INT, error VARCHAR))»).
- In SQL è stata fornita la possibilità di formare query che iniziano con la parola «FROM» anziché «SELECT». In questo caso si intende che la query inizia con «SELECT *».
- In SQL è stata aggiunta la supporto per l'espressione «COLUMNS», che consente 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 nome composto da «val» e numeri.
- È stata aggiunta la supporto per le operazioni sulle 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, per la gestione della memoria è stata adottata la libreria jemalloc. Le performance delle operazioni di unione degli hash sono state significativamente migliorate in condizioni di memoria limitata.
- Nell'interfaccia della riga di comando è stata aggiunta la modalità di output «.mode duckbox», che scarta le colonne medie in base alla larghezza della finestra del terminale (adatta per una rapida valutazione visiva dei risultati delle query con un gran numero di colonne, come «SELECT * FROM tbl», che nel modo normale si estendono su più righe). Con il parametro «.maxrows X» è possibile limitare anche il numero di righe visualizzate.
- Nel CLI è stata garantita la completamento automatico dell'input considerando il contesto (viene completato l'input di parole chiave, nomi delle tabelle, funzioni, nomi delle colonne e nomi dei file).
- Nel CLI è attivata di default la visualizzazione dell'indicatore di progresso dell'esecuzione della query.
Fonte: opennet.ru
