DuckDB 0.6.0, variante de SQLite para consultas analíticas publicada

La versión DuckDB 0.6.0 DBMS está disponible, combinando propiedades de SQLite como la compacidad, la capacidad de conectarse en forma de biblioteca integrada, almacenar la base de datos en un solo archivo y una interfaz CLI conveniente, con herramientas y optimizaciones para realizar consultas analíticas. cubriendo una parte significativa de los datos almacenados, por ejemplo, que realizan la agregación de todo el contenido de las tablas o fusionan varias tablas grandes. El código del proyecto se distribuye bajo la licencia MIT. El desarrollo aún se encuentra en la etapa de formación de lanzamientos experimentales, ya que el formato del repositorio aún no está estabilizado y cambia de una versión a otra.

DuckDB proporciona un dialecto extendido del lenguaje SQL que incluye capacidades adicionales para manejar consultas muy complejas y de larga ejecución. Admite el uso de tipos complejos (matrices, estructuras, uniones) y la capacidad de ejecutar subconsultas correlacionadas arbitrarias y anidadas. Admite la ejecución simultánea de múltiples consultas, ejecución de consultas directamente desde archivos en formato CSV y Parquet. Es posible importar desde PostgreSQL DBMS.

Además del código de shell de SQLite, el proyecto utiliza un analizador de PostgreSQL, movido a una biblioteca separada, el componente Date Math de MonetDB, su propia implementación de funciones de ventana (basado en el algoritmo Segment Tree Aggregation), un procesador de expresiones regulares basado en la librería RE2, su propio optimizador de consultas, mecanismo de control MVCC ejecución simultánea de tareas (Multi-Version Concurrency Control), así como un motor de ejecución de consultas vectorizado basado en el algoritmo Hyper-Pipelining Query Execution, que permite procesar grandes conjuntos de valores a la vez en una sola operación.

Entre los cambios en la nueva versión:

  • Se continuó trabajando en la mejora del formato de almacenamiento. Se ha implementado un modo de escritura de disco optimista, en el que cuando se carga un gran conjunto de datos en una transacción, los datos se comprimen y se transmiten a un archivo desde la base de datos sin esperar a que el comando COMMIT confirme la transacción. Durante la llegada del comando COMMIT, los datos ya están escritos en el disco, y cuando se ejecuta ROLLBACK, se descartan. Anteriormente, los datos inicialmente se almacenaban por completo en la memoria y, cuando se confirmaban, se guardaban en el disco.
  • Se agregó soporte para la carga paralela de datos en tablas separadas, lo que puede aumentar significativamente la velocidad de carga en sistemas multinúcleo. Por ejemplo, en la versión anterior, cargar una base de datos con 150 millones de filas en una CPU de 10 núcleos tomó 91 segundos, y en la nueva versión, esta operación toma 17 segundos. Hay dos modos de carga paralela: con conservación del orden de los registros y sin conservación del orden.
  • Para la compresión de datos, se utiliza el algoritmo FSST (tabla rápida de símbolos estáticos), que le permite empaquetar datos dentro de filas utilizando un diccionario común de coincidencias de tipo. La aplicación del nuevo algoritmo permitió reducir el tamaño de la base de datos de prueba de 761 MB a 251 MB.
  • Para comprimir números de coma flotante (DOUBLE y FLOAT), se proponen los algoritmos Chimp y Patas. En comparación con el algoritmo Gorillas anterior, Chimp proporciona un mayor nivel de compresión y una descompresión más rápida. El algoritmo Patas va a la zaga de Chimp en términos de compresión, pero es significativamente más rápido en la velocidad de descompresión, que es casi lo mismo que leer datos sin comprimir.
  • Se agregó una capacidad experimental para cargar datos de archivos CSV en varios flujos paralelos (SET experimental_parallel_csv=true), lo que reduce significativamente el tiempo de carga para archivos CSV grandes. Por ejemplo, cuando la opción estaba habilitada, el tiempo de descarga de un archivo CSV de 720 MB se redujo de 3.5 a 0.6 segundos.
  • Se ha implementado la posibilidad de ejecución paralela de operaciones de creación y gestión de índices. Por ejemplo, la ejecución de la operación CREATE INDEX en una columna con 16 millones de registros se redujo de 5.92 a 1.38 segundos.
  • Se proporciona la paralelización de operaciones de agregación en consultas que contienen la expresión "COUNT(DISTINCT col)".
  • Se ha agregado compatibilidad con el tipo UNION a SQL, lo que permite vincular varios tipos al mismo elemento (por ejemplo, "UNION(num INT, error VARCHAR))".
  • SQL brinda la capacidad de generar consultas que comienzan con la palabra "FROM" en lugar de "SELECT". En este caso, se supone que la consulta comienza con "SELECT *".
  • Se agregó soporte para la expresión "COLUMNAS" en SQL, lo que le permite realizar una operación en varias columnas sin duplicar la expresión. Por ejemplo, "SELECT MIN(COLUMNS(*)) from obs;" hará que se ejecute la función MIN para cada columna en la tabla obs, y "SELECT COLUMNS('val[0-9]+') from obs;" para columnas con un nombre compuesto por "val" y números.
  • Se agregó soporte para operaciones de lista, como "SELECCIONAR [x + 1 para x en [1, 2, 3]] AS l;".
  • Consumo de memoria optimizado. De forma predeterminada en la plataforma Linux, la biblioteca jemalloc se utiliza para la gestión de la memoria. Se mejoró significativamente el rendimiento de las operaciones de combinación de hash cuando la memoria es limitada.
  • Se agregó el modo de salida ".mode duckbox" a la CLI, descartando las columnas centrales en función de las líneas de ancho de la ventana del terminal). Con el parámetro ".maxrows X", también puede limitar el número de filas de salida.
  • La CLI proporciona autocompletado de entrada teniendo en cuenta el contexto (se completa la entrada de palabras clave, nombres de tablas, funciones, nombres de columnas y nombres de archivos).
  • La CLI está habilitada de forma predeterminada para mostrar un indicador de progreso de consulta.

Fuente: opennet.ru

Añadir un comentario