Está disponible la versión 0.6.0 de la base de datos DuckDB, que combina características de SQLite, como su compactabilidad, la capacidad de ser utilizada como una biblioteca embebida, el almacenamiento de la base de datos en un solo archivo, y una interfaz de línea de comandos fácil de usar, con herramientas y optimizaciones para ejecutar consultas analíticas que abarcan una parte significativa de los datos almacenados, por ejemplo, realizando agregaciones de todo el contenido de las tablas o combinando varias tablas grandes. El código del proyecto está disponible bajo la licencia MIT. El desarrollo se encuentra todavía en una fase de lanzamiento experimental, ya que el formato de almacenamiento no está estabilizado y cambia de versión a versión.
DuckDB ofrece un dialecto SQL extendido que incluye funcionalidades adicionales para el procesamiento de consultas muy complejas y de larga duración. Se admite el uso de tipos complejos (arreglos, estructuras, uniones) y la posibilidad de ejecutar subconsultas correlacionadas de forma arbitraria y anidada. Se admite la ejecución simultánea de múltiples consultas, así como la ejecución de consultas directamente desde archivos en formato CSV y Parquet. También hay posibilidades de importación desde bases de datos PostgreSQL.
Además del código de la interfaz de SQLite, el proyecto utiliza un analizador extraído en una biblioteca separada de PostgreSQL, el componente Date Math de MonetDB, su propia implementación de funciones de ventana (basada en el algoritmo de agregación Segment Tree), un procesador de expresiones regulares basado en la biblioteca RE2, un optimizador de consultas propio, un mecanismo MVCC de control de concurrencia de múltiples versiones (Multi-Version Concurrency Control), así como un motor de ejecución de consultas vectorizado basado en el algoritmo de Ejecución de Consultas Hyper-Pipelining, que permite procesar grandes conjuntos de valores en una sola operación.
Entre los cambios en la nueva versión:
- Se continúa trabajando en la mejora del formato de almacenamiento. Se ha implementado un modo de escritura optimista en disco, en el que al cargar un gran conjunto de datos en una sola transacción, los datos se comprimen y se escriben en archivo de la base de datos en modo stream, sin esperar a que se complete la confirmación de la transacción con el comando COMMIT. Cuando se recibe el comando COMMIT, los datos ya están escritos en el disco, y al ejecutar ROLLBACK, se descartan. Anteriormente, los datos se guardaban primero completamente en memoria y se escribían en disco al confirmar.
- Se ha añadido soporte para la carga paralela de datos en tablas separadas, lo que permite aumentar considerablemente la velocidad de carga en sistemas multinúcleo. Por ejemplo, en la versión anterior, cargar una base de datos de 150 millones de filas en un CPU de 10 núcleos tardaba 91 segundos, mientras que en la nueva versión, esta operación se realiza en 17 segundos. Se contemplan dos modos de carga paralela: manteniendo el orden de los registros y sin mantener el orden.
- Se utiliza el algoritmo FSST (Fast Static Symbol Table) para la compresión de datos, que permite empaquetar datos dentro de cadenas utilizando un diccionario común de coincidencias típicas. La aplicación del nuevo algoritmo ha permitido reducir el tamaño de la base de datos de prueba de 761 MB a 251 MB.
- Se han propuesto los algoritmos Chimp y Patas para la compresión de números de punto flotante (DOUBLE y FLOAT). En comparación con el algoritmo Gorillas utilizado anteriormente, Chimp ofrece un nivel de compresión más alto y una descompresión más rápida. El algoritmo Patas es inferior a Chimp en cuanto a la tasa de compresión, pero significativamente más rápido en la velocidad de descompresión, que es casi idéntica a la lectura de datos sin comprimir.
- Se ha añadido una función experimental que permite la carga de datos desde archivos CSV en varios hilos paralelos (SET experimental_parallel_csv=true), lo que reduce significativamente el tiempo de carga de archivos CSV grandes. Por ejemplo, al habilitar la opción, el tiempo de carga de un archivo CSV de 720 MB se redujo de 3.5 a 0.6 segundos.
- Se ha implementado la posibilidad de ejecutar operaciones de creación y gestión de índices en paralelo. Por ejemplo, la operación CREATE INDEX para una columna con 16 millones de registros se redujo de 5.92 a 1.38 segundos.
- Se ha garantizado el paralelismo en las operaciones de agregación en consultas que contienen la expresión "COUNT(DISTINCT col)".
- Se ha añadido soporte en SQL para el tipo UNION, que permite la unión de varios tipos a un solo elemento (por ejemplo, "UNION(num INT, error VARCHAR)").
- En SQL se ha proporcionado la posibilidad de formar consultas que comienzan con la palabra "FROM" en lugar de "SELECT". En este caso, se supone que la consulta comienza con "SELECT *".
- Se ha añadido soporte en SQL para la expresión "COLUMNS", que permite realizar operaciones en múltiples columnas sin duplicar la expresión. Por ejemplo, "SELECT MIN(COLUMNS(*)) from obs;" ejecutará la función MIN para cada columna en la tabla obs, y "SELECT COLUMNS(‘val[0-9]+’) from obs;" para columnas cuyos nombres consisten en "val" y números.
- Se ha añadido soporte para operaciones en listas, por ejemplo, "SELECT [x + 1 for x in [1, 2, 3]] AS l;".
- Se ha optimizado el consumo de memoria. Por defecto, en la plataforma Linux, se utiliza la biblioteca jemalloc para la gestión de memoria. Se ha mejorado significativamente el rendimiento de las operaciones de unión hash con un tamaño de memoria limitado.
- En la interfaz de línea de comandos se ha añadido un modo de salida ".mode duckbox", que descarta las columnas intermedias teniendo en cuenta el ancho de la ventana del terminal (ideal para una evaluación rápida de resultados de consultas con un gran número de columnas, como "SELECT * FROM tbl", que normalmente se extienden en varias líneas). Además, se puede limitar el número de filas mostradas con el parámetro ".maxrows X".
- En el CLI se ha habilitado el autocompletado de entrada teniendo en cuenta el contexto (se complementa la entrada de palabras clave, nombres de tablas, funciones, nombres de columnas y nombres de archivos).
- En el CLI, la visualización del indicador de progreso para la ejecución de consultas está habilitada por defecto.
Fuente: opennet.ru
