Pubblicata DuckDB 0.6.0, variante SQLite per query analitiche

È disponibile il rilascio del DBMS DuckDB 0.6.0, che combina proprietà di SQLite come compattezza, capacità di connessione sotto forma di libreria incorporata, memorizzazione del database in un file e una comoda interfaccia CLI, con strumenti e ottimizzazioni per l'esecuzione query analitiche che coprono una parte significativa dei dati archiviati, ad esempio che aggregano l'intero contenuto di tabelle o uniscono diverse tabelle di grandi dimensioni. Il codice del progetto è distribuito sotto la licenza MIT. Lo sviluppo è ancora nella fase di formazione delle versioni sperimentali, poiché il formato di archiviazione non è stato ancora stabilizzato e cambia da versione a versione.

DuckDB fornisce un dialetto SQL avanzato che include funzionalità aggiuntive per la gestione di query molto complesse e dispendiose in termini di tempo. Sono supportati l'uso di tipi complessi (array, strutture, unioni) e la capacità di eseguire sottoquery correlate arbitrarie e nidificate. Supporta l'esecuzione di più query contemporaneamente, eseguendo query direttamente da file CSV e Parquet. È possibile importare dal DBMS PostgreSQL.

Oltre al codice shell di SQLite, il progetto utilizza un parser di PostgreSQL in una libreria separata, il componente Date Math di MonetDB, la propria implementazione di funzioni finestra (basata sull'algoritmo Segment Tree Aggregation), un processore di espressioni regolari basato su la libreria RE2, il proprio ottimizzatore di query e un meccanismo di controllo MVCC per l'esecuzione simultanea di attività (Multi-Version Concurrency Control), nonché un motore di esecuzione di query vettorizzato basato sull'algoritmo Hyper-Pipelining Query Execution, che consente grandi insiemi di valori da elaborare contemporaneamente in un'unica operazione.

Tra le novità della nuova release:

  • È continuato il lavoro per migliorare il formato di archiviazione. È stata implementata una modalità di scrittura su disco ottimistica, in cui quando si carica un grande set di dati in un'unica transazione, i dati vengono compressi e scritti in un file dal database in modalità streaming, senza attendere la conferma della transazione con il comando COMMIT . Quando viene ricevuto un comando COMMIT, i dati sono già scritti su disco e quando viene eseguito un ROLLBACK, vengono scartati. In precedenza, i dati venivano inizialmente salvati completamente in memoria e, una volta salvati, su disco.
  • Aggiunto il supporto per il caricamento parallelo dei dati in tabelle separate, che consente di aumentare significativamente la velocità di caricamento su sistemi multi-core. Ad esempio, nella versione precedente, il caricamento di un database con 150 milioni di righe su una CPU a 10 core richiedeva 91 secondi, ma nella nuova versione questa operazione viene completata in 17 secondi. Esistono due modalità di caricamento parallele: con mantenimento dell'ordine dei record e senza mantenimento dell'ordine.
  • Per la compressione dei dati viene utilizzato l'algoritmo FSST (Fast Static Symbol Table), che consente di comprimere i dati all'interno di stringhe utilizzando un dizionario comune di corrispondenze tipiche. L'utilizzo del nuovo algoritmo ha permesso di ridurre la dimensione del database dei test da 761MB a 251MB.
  • Sono stati proposti algoritmi Chimp e Patas per comprimere i numeri in virgola mobile (DOUBLE e FLOAT). Rispetto al precedente algoritmo Gorillas, Chimp fornisce livelli di compressione più elevati e una decompressione più rapida. L'algoritmo Patas è in ritardo rispetto a Chimp nel rapporto di compressione, ma è molto più veloce nella velocità di decompressione, che non è quasi diversa dalla lettura dei dati non compressi.
  • Aggiunta una capacità sperimentale di caricare dati da file CSV in più flussi paralleli (SET sperimentale_parallel_csv=true), che riduce significativamente il tempo necessario per caricare file CSV di grandi dimensioni. Ad esempio, quando questa opzione era abilitata, il tempo di download per un file CSV da 720 MB veniva ridotto da 3.5 a 0.6 secondi.
  • È stata implementata la possibilità di esecuzione parallela delle operazioni di creazione e gestione degli indici. Ad esempio, l'operazione CREATE INDEX su una colonna con 16 milioni di record è stata ridotta da 5.92 a 1.38 secondi.
  • Abilitata la parallelizzazione delle operazioni di aggregazione nelle query contenenti l'espressione "COUNT(DISTINCT col)".
  • SQL ha aggiunto il supporto per il tipo UNION, che consente di associare più tipi a un elemento (ad esempio, "UNION(num INT, errore VARCHAR))").
  • SQL offre la possibilità di formare query che iniziano con la parola "FROM" anziché "SELECT". In questo caso si presuppone che la query inizi con "SELECT *".
  • SQL ha aggiunto il supporto per l'espressione COLUMNS, che consente di eseguire un'operazione su più colonne senza duplicare l'espressione. Ad esempio, "SELECT MIN(COLUMNS(*)) from obs;" farà sì che la funzione MIN venga eseguita per ogni colonna nella tabella obs e "SELECT COLUMNS('val[0-9]+') from obs;" per le colonne con un nome composto da "val" e numeri.
  • Aggiunto il supporto per le operazioni sugli elenchi, ad esempio "SELECT [x + 1 for x in [1, 2, 3]] AS l;".
  • Il consumo di memoria è stato ottimizzato. Per impostazione predefinita, la piattaforma Linux utilizza la libreria jemalloc per la gestione della memoria. Prestazioni significativamente migliorate delle operazioni di fusione degli hash quando la memoria è limitata.
  • Aggiunta la modalità di output ".mode duckbox" all'interfaccia della riga di comando, che scarta le colonne centrali tenendo conto della larghezza della finestra del terminale (adatta per valutare rapidamente visivamente i risultati di query con un numero elevato di colonne, come "SELECT * FROM tbl”, che in modalità normale sono ripartiti su più righe). Utilizzando il parametro ".maxrows X", è possibile limitare ulteriormente il numero di righe visualizzate.
  • La CLI fornisce il completamento automatico dell'input tenendo conto del contesto (l'inserimento di parole chiave, nomi di tabelle, funzioni, nomi di colonne e nomi di file viene completato).
  • La CLI dispone di un indicatore di avanzamento della query abilitato per impostazione predefinita.

Fonte: opennet.ru

Aggiungi un commento