Skip to main content
Si vienes de una base de datos relacional tradicional, es posible que busques procedimientos almacenados y sentencias preparadas en ClickHouse. Esta guía explica el enfoque de ClickHouse respecto a estos conceptos y ofrece alternativas recomendadas.

Alternativas a los procedimientos almacenados en ClickHouse

ClickHouse no admite procedimientos almacenados tradicionales con lógica de control de flujo (IF/ELSE, bucles, etc.). Se trata de una decisión de diseño deliberada, basada en la arquitectura de ClickHouse como base de datos analítica. Los bucles se desaconsejan en las bases de datos analíticas porque procesar O(n) consultas simples suele ser más lento que procesar un menor número de consultas complejas. ClickHouse está optimizado para:
  • Cargas de trabajo analíticas - Agregaciones complejas sobre grandes conjuntos de datos
  • Procesamiento por lotes - Procesamiento eficiente de grandes volúmenes de datos
  • Consultas declarativas - Consultas SQL que describen qué datos recuperar, no cómo procesarlos
Los procedimientos almacenados con lógica procedimental van en contra de estas optimizaciones. En su lugar, ClickHouse ofrece alternativas que aprovechan sus puntos fuertes.

Funciones definidas por el usuario (UDFs)

Las funciones definidas por el usuario permiten encapsular lógica reutilizable sin flujo de control. ClickHouse admite dos tipos:

UDFs basadas en lambda

Cree funciones con expresiones SQL y sintaxis lambda:
Limitaciones:
  • No hay bucles ni flujos de control complejos
  • No se pueden modificar datos (INSERT/UPDATE/DELETE)
  • No se permiten funciones recursivas
Consulta CREATE FUNCTION para ver la sintaxis completa.

UDF ejecutables

Para una lógica más compleja, utilice UDF ejecutables que llamen a programas externos:
Las UDF ejecutables pueden implementar lógica arbitraria en cualquier lenguaje de programación (Python, Node.js, Go, etc.). Consulta UDF ejecutables para obtener más información.

Vistas parametrizadas

Las vistas parametrizadas actúan como funciones que devuelven conjuntos de datos. Son ideales para consultas reutilizables con filtrado dinámico:

Casos de uso comunes

Consulta la sección Vistas parametrizadas para más información.

Vistas materializadas

Las vistas materializadas son ideales para precalcular agregaciones costosas que tradicionalmente se harían en procedimientos almacenados. Si vienes de una base de datos tradicional, piensa en una vista materializada como un trigger de INSERT que transforma y agrega datos automáticamente a medida que se insertan en la tabla de origen:

Vistas materializadas actualizables

Para el procesamiento por lotes programado (como los procedimientos almacenados que se ejecutan por la noche):
Consulte Vistas materializadas en cascada para ver patrones avanzados.

Orquestación externa

Para lógica de negocio compleja, flujos de trabajo ETL o procesos de varios pasos, siempre es posible implementar la lógica fuera de ClickHouse mediante clientes para distintos lenguajes.

Uso del código de la aplicación

A continuación se muestra una comparación en paralelo de cómo un procedimiento almacenado de MySQL puede trasladarse a código de la aplicación con ClickHouse:

Diferencias clave

  1. Flujo de control - Los procedimientos almacenados de MySQL usan IF/ELSE y bucles WHILE. En ClickHouse, implemente esta lógica en el código de su aplicación (Python, Java, etc.)
  2. Transacciones - MySQL admite BEGIN/COMMIT/ROLLBACK para transacciones ACID. ClickHouse es una base de datos analítica optimizada para cargas de trabajo de solo inserción, no para actualizaciones transaccionales
  3. Actualizaciones - MySQL usa sentencias UPDATE. ClickHouse prefiere INSERT con ReplacingMergeTree o CollapsingMergeTree para datos mutables
  4. Variables y estado - Los procedimientos almacenados de MySQL pueden declarar variables (DECLARE v_discount). Con ClickHouse, gestione el estado en el código de su aplicación
  5. Gestión de errores - MySQL admite SIGNAL y manejadores de excepciones. En el código de la aplicación, use la gestión de errores nativa de su lenguaje (try/catch)
Cuándo usar cada enfoque:
  • Cargas de trabajo OLTP (pedidos, pagos, cuentas de usuario) → Use MySQL/PostgreSQL con procedimientos almacenados
  • Cargas de trabajo analíticas (informes, agregaciones, series temporales) → Use ClickHouse con orquestación desde la aplicación
  • Arquitectura híbrida → ¡Use ambos! Transfiera datos transaccionales desde OLTP a ClickHouse para análisis

Uso de herramientas de orquestación de flujos de trabajo

  • Apache Airflow - Programa y supervisa DAG complejos de consultas de ClickHouse
  • dbt - Transforma datos con flujos de trabajo basados en SQL
  • Prefect/Dagster - Orquestación moderna basada en Python
  • Planificadores personalizados - Tareas cron, Kubernetes CronJobs, etc.
Ventajas de la orquestación externa:
  • Capacidades completas de un lenguaje de programación
  • Mejor gestión de errores y lógica de reintento
  • Integración con sistemas externos (API, otras bases de datos)
  • Control de versiones y pruebas
  • Monitorización y alertas
  • Programación más flexible

Alternativas a las sentencias preparadas en ClickHouse

Aunque ClickHouse no tiene “sentencias preparadas” tradicionales en el sentido de los RDBMS, ofrece parámetros de consulta que cumplen la misma función: consultas seguras y parametrizadas que evitan la inyección SQL.

Sintaxis

Hay dos formas de definir parámetros de consulta:

Método 1: usar SET

Método 2: uso de parámetros de la CLI

Sintaxis de los parámetros

Se hace referencia a los parámetros mediante: {parameter_name: DataType}
  • parameter_name - El nombre del parámetro (sin el prefijo param_)
  • DataType - El tipo de dato de ClickHouse al que se convierte el parámetro

Ejemplos de tipos de datos


Para usar parámetros de consulta en clientes para lenguajes, consulta la documentación del cliente del lenguaje específico que te interese.

Limitaciones de los parámetros de consulta

Los parámetros de consulta no son sustituciones de texto de uso general. Tienen limitaciones específicas:
  1. Están destinados principalmente a las sentencias SELECT; la mejor compatibilidad se da en las consultas SELECT
  2. Funcionan como identificadores o literales; no pueden sustituir fragmentos arbitrarios de SQL
  3. Tienen compatibilidad limitada con DDL; se admiten en CREATE TABLE, pero no en ALTER TABLE
Qué FUNCIONA:
Lo que NO funciona:

Buenas prácticas de seguridad

Use siempre parámetros de consulta para los datos introducidos por el usuario:
Valide los tipos de datos de entrada:

Sentencias preparadas del protocolo MySQL

La interfaz MySQL de ClickHouse incluye una compatibilidad mínima con sentencias preparadas (COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE), principalmente para permitir la conexión con herramientas como Tableau Online que encapsulan consultas en sentencias preparadas. Limitaciones clave:
  • No se admite la vinculación de parámetros - No puedes usar marcadores de posición ? con parámetros vinculados
  • Las consultas se almacenan, pero no se analizan durante PREPARE
  • La implementación es mínima y está pensada para la compatibilidad con herramientas de BI específicas
Ejemplo de lo que no funciona:
Use en su lugar los parámetros de consulta nativos de ClickHouse. Ofrecen compatibilidad total con la vinculación de parámetros, seguridad de tipos y protección frente a la inyección de SQL en todas las interfaces de ClickHouse:
Para obtener más información, consulte la documentación de la interfaz MySQL y el artículo del blog sobre la compatibilidad con MySQL.

Resumen

Alternativas de ClickHouse frente a los procedimientos almacenados

Uso de los parámetros de consulta

Los parámetros de consulta se pueden usar para:
  • Prevenir la inyección SQL
  • Consultas parametrizadas con seguridad de tipos
  • Filtrado dinámico en aplicaciones
  • Plantillas de consulta reutilizables
Última modificación el 3 de julio de 2026