Alternativas aos procedimentos armazenados no ClickHouse
O ClickHouse não oferece suporte a procedimentos armazenados tradicionais com lógica de controle de fluxo (IF/ELSE, loops etc.).
Essa é uma decisão de design intencional, baseada na arquitetura do ClickHouse como um banco de dados analítico.
Loops não são recomendados em bancos de dados analíticos porque processar O(n) consultas simples geralmente é mais lento do que processar um número menor de consultas complexas.
O ClickHouse é otimizado para:
- Cargas de trabalho analíticas - Agregações complexas em grandes conjuntos de dados
- Processamento em lote - Processamento eficiente de grandes volumes de dados
- Consultas declarativas - Consultas SQL que descrevem quais dados recuperar, e não como processá-los
Funções Definidas pelo Usuário (UDFs)
As Funções Definidas pelo Usuário permitem encapsular lógica reutilizável sem controle de fluxo. O ClickHouse oferece dois tipos:UDFs baseadas em lambda
Crie funções usando expressões SQL e sintaxe de lambda:Dados de exemplo para os exemplos
Dados de exemplo para os exemplos
- Sem loops nem fluxo de controle complexo
- Não podem modificar dados (
INSERT/UPDATE/DELETE) - Funções recursivas não são permitidas
CREATE FUNCTION para a sintaxe completa.
UDFs executáveis
Para lógicas mais complexas, use UDFs executáveis que chamam programas externos:Views parametrizadas
Views parametrizadas funcionam como funções que retornam conjuntos de dados. Elas são ideais para consultas reutilizáveis com filtragem dinâmica:Dados de exemplo
Dados de exemplo
Casos de uso comuns
- Filtragem dinâmica por intervalo de datas
- Segmentação de dados por usuário
- Acesso a dados em ambiente multilocatário
- Modelos de relatório
- Mascaramento de dados
Visões materializadas
Visões materializadas são ideais para pré-calcular agregações de alto custo que, tradicionalmente, seriam feitas em procedimentos armazenados. Se você está acostumado a um banco de dados tradicional, pense em uma visão materializada como um trigger de INSERT que transforma e agrega dados automaticamente à medida que eles são inseridos na tabela de origem:Visões materializadas atualizáveis
Para processamento em lote agendado (como procedimentos armazenados executados à noite):Orquestração externa
Para lógica de negócios complexa, fluxos de trabalho de ETL ou processos com várias etapas, sempre é possível implementar a lógica fora do ClickHouse, usando clientes em diferentes linguagens.Usando código da aplicação
Veja, lado a lado, como um procedimento armazenado do MySQL pode ser implementado em código da aplicação com ClickHouse:- Procedimento armazenado no MySQL
- Código de aplicação do ClickHouse
Principais diferenças
- Fluxo de controle - Procedimentos armazenados do MySQL usam
IF/ELSEe loopsWHILE. No ClickHouse, implemente essa lógica no código da aplicação (Python, Java etc.) - Transações - O MySQL oferece suporte a
BEGIN/COMMIT/ROLLBACKpara transações ACID. O ClickHouse é um banco de dados analítico otimizado para cargas de trabalho append-only, não para atualizações transacionais - Atualizações - O MySQL usa instruções
UPDATE. O ClickHouse prefereINSERTcom ReplacingMergeTree ou CollapsingMergeTree para dados mutáveis - Variáveis e estado - Procedimentos armazenados do MySQL podem declarar variáveis (
DECLARE v_discount). No ClickHouse, gerencie o estado no código da aplicação - Tratamento de erros - O MySQL oferece suporte a
SIGNALe manipuladores de exceção. No código da aplicação, use o tratamento de erros nativo da sua linguagem (try/catch)
Uso de ferramentas de orquestração de fluxos de trabalho
- Apache Airflow - Agendamento e monitoramento de DAGs complexos de consultas do ClickHouse
- dbt - Transformação de dados com fluxos de trabalho baseados em SQL
- Prefect/Dagster - Orquestração moderna baseada em Python
- Agendadores personalizados - Cron jobs, Kubernetes CronJobs etc.
- Todos os recursos de uma linguagem de programação
- Melhor tratamento de erros e lógica de retentativa
- Integração com sistemas externos (APIs, outros bancos de dados)
- Controle de versão e testes
- Monitoramento e alertas
- Agendamento mais flexível
Alternativas a instruções preparadas no ClickHouse
Embora o ClickHouse não tenha “instruções preparadas” tradicionais no sentido de um SGBDR, ele oferece parâmetros de consulta que cumprem a mesma função: consultas parametrizadas e seguras que evitam injeção de SQL.Sintaxe
Há duas formas de definir parâmetros de consulta:Método 1: usando SET
Tabela de exemplo e dados
Tabela de exemplo e dados
Método 2: usando parâmetros da CLI
Sintaxe dos parâmetros
Os parâmetros são referenciados da seguinte forma:{parameter_name: DataType}
parameter_name- O nome do parâmetro (sem o prefixoparam_)DataType- O tipo de dado do ClickHouse para o qual o parâmetro será convertido
Exemplos de tipos de dados
Tabelas e dados de amostra deste exemplo
Tabelas e dados de amostra deste exemplo
- Strings & Números
- Datas & Horários
- Arrays
- Maps
- Identificadores
Para usar parâmetros de consulta em clientes por linguagem, consulte a documentação do cliente da linguagem específica que interessa a você.
Limitações dos parâmetros de consulta
Parâmetros de consulta não são substituições de texto de uso geral. Eles têm limitações específicas:- Destinam-se principalmente a instruções SELECT - o melhor suporte está em consultas SELECT
- Eles funcionam como identificadores ou literais - não podem substituir fragmentos arbitrários de SQL
- Eles têm suporte limitado para DDL - são compatíveis com
CREATE TABLE, mas não comALTER TABLE
Práticas recomendadas de segurança
Sempre use parâmetros de consulta para dados fornecidos pelo usuário:Instruções preparadas no protocolo MySQL
A interface MySQL do ClickHouse inclui suporte mínimo a instruções preparadas (COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE), principalmente para permitir a conexão com ferramentas como o Tableau Online, que encapsulam consultas em instruções preparadas.
Principais limitações:
- A vinculação de parâmetros não é compatível - Você não pode usar placeholders
?com parâmetros vinculados - As consultas são armazenadas, mas não são analisadas durante o
PREPARE - A implementação é mínima e foi projetada para compatibilidade com ferramentas de BI específicas
Resumo
Alternativas do ClickHouse aos procedimentos armazenados
Uso de parâmetros de consulta
Os parâmetros de consulta podem ser usados para:- Evitar injeção de SQL
- Consultas parametrizadas com segurança de tipos
- Filtragem dinâmica em aplicações
- Templates de consulta reutilizáveis
Documentação relacionada
CREATE FUNCTION- Funções Definidas pelo UsuárioCREATE VIEW- Views, incluindo parametrizadas e materializadas- Sintaxe SQL - Parâmetros de consulta - Sintaxe completa dos parâmetros
- Visões materializadas em cascata - Padrões avançados de visões materializadas
- UDFs executáveis - Execução de funções externas