Introducción
La versión 2.0.0 de DuckDB, con nombre en clave “Cinnamon Teal”, es la mayor actualización de funcionalidades hasta la fecha, construida sobre casi 20.000 commits desde la versión 1.5. Se trata de una versión LTS (Long-Term Support) con soporte garantizado hasta, al menos, octubre de 2027.
A diferencia del salto a la 1.0 (centrado en estabilidad), la 2.0 es eminentemente una versión de funcionalidades. El cambio conceptual más importante es que DuckDB deja de ser exclusivamente una base de datos in-process para abrirse a un modelo cliente-servidor completo.
🚀 Cambios y funcionalidades principales¶
1. Modo servidor: protocolo Quack y sentencia CONNECT
Se consolida el protocolo nativo Quack, que permite que cualquier proceso de DuckDB sirva sus bases de datos por red. La nueva sentencia CONNECT permite adjuntar y cambiar a una base de datos remota en un solo comando.
- Compatibilidad ampliada: CONNECT no se limita a Quack; también funciona con PostgreSQL y MySQL. Para ellos, el nuevo optimizador de pushdown remoto envía las consultas directamente al servidor remoto en lugar de descargar tablas completas, mejorando drásticamente el rendimiento.
- Integración en CLI: Los argumentos -serve y -connect permiten iniciar un servidor o conectarse a uno directamente desde la línea de comandos.
2. Tipo de dato VARIANT de primera clase
El tipo VARIANT (pensado como un “JSON con esteroides”) queda completamente integrado. A diferencia de JSON (texto), VARIANT detecta y “desmenuza” (shredding) la estructura común de datos semiestructurados, almacenándola en columnas tipadas. Esto permite una compresión eficiente y consultas muy rápidas sin necesidad de declarar un esquema.
Funciona de extremo a extremo (Integración completa), incluyendo lectura/escritura shredded en Parquet, pushdown de extracción en los escaneos y una familia de funciones variant_* para su manipulación.
3. Triggers SQL
Triggers (disparadores) completamente funcionales, una petición muy solicitada durante años. Incluyen BEFORE/AFTER, FOR EACH ROW/FOR EACH STATEMENT, tablas de transición (REFERENCING OLD/NEW TABLE), múltiples triggers por evento y DROP TRIGGER. Su caso de uso clásico es la creación de tablas de auditoría automáticas.
4. E/S asíncrona para acelerar la lectura remota
Introduce E/S asíncrona para Parquet, CSV (UTF-8 sin comprimir) y el formato de almacenamiento nativo. La capa de E/S ahora escala de forma independiente a la de procesamiento, iniciando lecturas en segundo plano y manteniendo múltiples peticiones abiertas. Esto paraleliza mucho más la lectura remota, acelerando drásticamente las consultas sobre almacenamiento de objetos como S3. En pruebas con Overture Maps, la lectura desde S3 resultó unas 3 veces más rápida que en la 1.5.
5. Agent Mode (Modo Agente) para IA
Funcionalidad pensada para que agentes de codificación IA (como Claude Code, Codex o Cursor) interactúen con DuckDB de forma más eficiente. Se activa automáticamente al detectar dichos entornos y adapta la salida de la CLI.
Genera tablas Markdown compactas, muestra errores en JSON, limita el número de filas y trunca celdas largas. En una prueba de TPC-H, redujo los tokens de salida en un 59% (de 123.600 a 50.800), facilitando y abaratando el consumo por parte del modelo de IA.
6. Mejoras en el dialecto SQL
NEARESTjoins: Permiten realizar búsquedas de similitud top-k (por ejemplo, para vectores o embeddings) directamente como una cláusulaJOIN. La sintaxisAPPROX NEAREST ... BY SIMILARITYsimplifica enormemente este tipo de consultas.DMLdentro deCTE: Ahora se pueden ejecutar sentencias de modificación de datos (INSERT,UPDATE,DELETE) dentro de expresiones de tabla comunes (WITH ... AS).- Otras mejoras: Nuevas funciones de mutación de JSON, variables de sesión y
CTErecursivas con agregaciónUSING KEY(con una mejora de rendimiento de hasta 40× en una prueba de grafo recursivo).
⚡️ Rendimiento y motor¶
- Nuevo formato de almacenamiento (v2.0): Optimizado con metadatos perezosos (lazy metadata), compresión
DICT_FSST, borrados compactos y una puesta en marcha con menor consumo de memoria. - Optimizador y ejecución: Se añaden agregaciones parciales por debajo de los joins, spilling a disco para agregaciones grandes, pruning de particiones en lakehouse y mejores zone maps y filtros Bloom para descartar datos.
- Cliente de Python: Se añade el tan esperado
Appender, que permite inserciones masivas por lotes de forma mucho más eficiente que las inserciones fila a fila.
⚠️ Cambios disruptivos (Breaking Changes) y migración¶
La 2.0 introduce un conjunto reducido pero importante de cambios incompatibles que deben evaluarse antes de actualizar.
- Nuevo formato de almacenamiento (v2.0): Es el cambio más crítico. Las versiones anteriores a la 2.0 no pueden leer los archivos de base de datos creados con el nuevo formato por defecto. La dirección inversa sí funciona: DuckDB 2.0 puede leer y escribir bases de datos de la 1.x, pero una vez migradas al nuevo formato, no hay vuelta atrás.
- Sintaxis lambda: Se deshabilita por defecto la sintaxis de flecha simple (
x -> ...) para expresiones lambda, completando la transición hacia la nueva sintaxis. - API de C/C++: La API de extensión ha sido reelaborada y ahora es versionada con garantías de ABI, lo que puede requerir la recompilación de extensiones nativas.
- Cliente de Python: Se requiere Python 3.11 o superior. Además, se ha eliminado
fetch_arrow_table()de los resultados de consulta, siendo reemplazado porcon.sql(query).to_arrow_table(). - Eliminación de ICU del núcleo: La extensión ICU ya no forma parte de la compilación principal; ahora se gestiona como una extensión separada, reduciendo el tamaño del binario base.
En resumen, DuckDB 2.0 es un salto cualitativo que transforma la herramienta de un motor analítico in-process a una plataforma de datos completa, con capacidades de servidor, tipos de datos semiestructurados de alto rendimiento y optimizaciones profundas para el trabajo con datos en la nube y agentes de IA.
Taller DuckDB 2.0
Tarea: completar el taller Ingeniería de Datos - DuckDB 2.0