DuckDB 0.6.0, variante SQLite para consultas analíticas publicadas

Está disponível o lançamento do DBMS DuckDB 0.6.0, combinando propriedades do SQLite como compacidade, capacidade de conexão na forma de uma biblioteca incorporada, armazenamento do banco de dados em um arquivo e uma interface CLI conveniente, com ferramentas e otimizações para execução consultas analíticas que cobrem uma parte significativa dos dados armazenados, por exemplo, que agregam todo o conteúdo de tabelas ou mesclam várias tabelas grandes. O código do projeto é distribuído sob a licença do MIT. O desenvolvimento ainda está em fase de formação de lançamentos experimentais, pois o formato de armazenamento ainda não foi estabilizado e muda de versão para versão.

DuckDB fornece um dialeto SQL avançado que inclui recursos adicionais para lidar com consultas muito complexas e demoradas. O uso de tipos complexos (matrizes, estruturas, uniões) e a capacidade de executar subconsultas correlacionadas arbitrárias e aninhadas são suportados. Ele suporta a execução de várias consultas simultaneamente, executando consultas diretamente de arquivos CSV e Parquet. É possível importar do SGBD PostgreSQL.

Além do código shell do SQLite, o projeto usa um analisador do PostgreSQL em uma biblioteca separada, o componente Date Math do MonetDB, sua própria implementação de funções de janela (baseada no algoritmo Segment Tree Aggregation), um processador de expressão regular baseado em a biblioteca RE2, seu próprio otimizador de consultas e um mecanismo de controle MVCC de execução simultânea de tarefas (Multi-Version Concurrency Control), bem como um mecanismo de execução de consultas vetorizado baseado no algoritmo Hyper-Pipelining Query Execution, que permite grandes conjuntos de valores ​​para ser processado de uma só vez em uma operação.

Entre as mudanças no novo lançamento:

  • O trabalho continuou para melhorar o formato de armazenamento. Foi implementado um modo otimista de gravação em disco, no qual ao carregar um grande conjunto de dados em uma transação, os dados são compactados e gravados em um arquivo do banco de dados em modo streaming, sem esperar que a transação seja confirmada pelo comando COMMIT . Quando um comando COMMIT é recebido, os dados já estão gravados no disco, e quando um ROLLBACK é executado, eles são descartados. Anteriormente, os dados eram inicialmente salvos completamente na memória e, quando confirmados, eram salvos no disco.
  • Adicionado suporte para carregamento paralelo de dados em tabelas separadas, o que permite aumentar significativamente a velocidade de carregamento em sistemas multi-core. Por exemplo, na versão anterior, carregar um banco de dados com 150 milhões de linhas em uma CPU de 10 núcleos demorava 91 segundos, mas na nova versão essa operação é concluída em 17 segundos. Existem dois modos de carregamento paralelo - com preservação da ordem dos registros e sem preservação da ordem.
  • Para compactação de dados, é utilizado o algoritmo FSST (Fast Static Symbol Table), que permite compactar dados dentro de strings usando um dicionário comum de correspondências típicas. A utilização do novo algoritmo permitiu reduzir o tamanho do banco de dados de teste de 761 MB para 251 MB.
  • Algoritmos Chimp e Patas foram propostos para compactar números de ponto flutuante (DOUBLE e FLOAT). Comparado ao algoritmo Gorillas anterior, o Chimp oferece níveis mais altos de compactação e descompressão mais rápida. O algoritmo Patas fica atrás do Chimp na taxa de compactação, mas é muito mais rápido na velocidade de descompactação, o que quase não é diferente da leitura de dados não compactados.
  • Adicionada uma capacidade experimental de carregar dados de arquivos CSV em vários fluxos paralelos (SET experimental_parallel_csv=true), o que reduz significativamente o tempo necessário para carregar arquivos CSV grandes. Por exemplo, quando esta opção foi ativada, o tempo de download de um arquivo CSV de 720 MB foi reduzido de 3.5 para 0.6 segundos.
  • Foi implementada a possibilidade de execução paralela de operações de criação e gerenciamento de índices. Por exemplo, a operação CREATE INDEX em uma coluna com 16 milhões de registros foi reduzida de 5.92 para 1.38 segundos.
  • Habilitada a paralelização de operações de agregação em consultas contendo a expressão “COUNT(DISTINCT col)”.
  • O SQL adicionou suporte para o tipo UNION, que permite que vários tipos sejam vinculados a um elemento (por exemplo, “UNION(num INT, erro VARCHAR))”).
  • SQL fornece a capacidade de formar consultas que começam com a palavra “FROM” em vez de “SELECT”. Neste caso, assume-se que a consulta começa com “SELECT *”.
  • SQL adicionou suporte para a expressão COLUMNS, que permite executar uma operação em múltiplas colunas sem duplicar a expressão. Por exemplo, “SELECIONE MIN(COLUNAS(*)) de obs;” fará com que a função MIN seja executada para cada coluna da tabela obs e "SELECT COLUMNS('val[0-9]+') from obs;" para colunas com um nome composto por "val" e números.
  • Adicionado suporte para operações em listas, por exemplo, “SELECT [x + 1 for x in [1, 2, 3]] AS l;”.
  • O consumo de memória foi otimizado. Por padrão, a plataforma Linux usa a biblioteca jemalloc para gerenciamento de memória. Desempenho significativamente melhorado de operações de mesclagem de hash quando a memória é limitada.
  • Adicionado modo de saída “.mode duckbox” à interface de linha de comando, que descarta as colunas do meio levando em consideração a largura da janela do terminal (adequado para avaliar visualmente rapidamente os resultados de consultas com um grande número de colunas, como “SELECT * FROM tbl”, que no modo normal estão espalhados por várias linhas). Usando o parâmetro “.maxrows X”, você pode limitar adicionalmente o número de linhas exibidas.
  • A CLI fornece preenchimento automático de entrada levando em consideração o contexto (a entrada de palavras-chave, nomes de tabelas, funções, nomes de colunas e nomes de arquivos é concluída).
  • A CLI possui um indicador de progresso de consulta habilitado por padrão.

Fonte: opennet.ru

Adicionar um comentário