Alternatives aux procédures stockées dans ClickHouse
ClickHouse ne prend pas en charge les procédures stockées traditionnelles avec une logique de contrôle de flux (IF/ELSE, boucles, etc.).
Il s’agit d’un choix de conception délibéré, lié à l’architecture de ClickHouse en tant que base de données analytique.
Les boucles sont déconseillées dans les bases de données analytiques, car exécuter O(n) requêtes simples est généralement plus lent qu’exécuter un plus petit nombre de requêtes complexes.
ClickHouse est optimisé pour :
- Charges de travail analytiques - Des agrégations complexes sur de grands jeux de données
- Traitement par lots - Le traitement efficace de grands volumes de données
- Requêtes déclaratives - Des requêtes SQL qui décrivent quelles données récupérer, et non comment les traiter
Fonctions définies par l’utilisateur (UDFs)
Les fonctions définies par l’utilisateur permettent d’encapsuler une logique réutilisable sans structures de contrôle. ClickHouse prend en charge deux types :UDF basées sur des expressions lambda
Créez des fonctions à l’aide d’expressions SQL et de la syntaxe lambda :Données d’exemple
Données d’exemple
- Pas de boucles ni de structures de contrôle complexes
- Impossible de modifier les données (
INSERT/UPDATE/DELETE) - Les fonctions récursives ne sont pas autorisées
CREATE FUNCTION pour la syntaxe complète.
UDF exécutables
Pour une logique plus complexe, utilisez des UDF exécutables qui appellent des programmes externes :Vues paramétrées
Les vues paramétrées se comportent comme des fonctions qui renvoient des jeux de données. Elles sont idéales pour des requêtes réutilisables avec un filtrage dynamique :Exemple de données
Exemple de données
Cas d’usage courants
- Filtrage dynamique par plage de dates
- Segmentation des données par utilisateur
- Accès aux données multi-tenant
- Modèles de rapports
- Masquage des données
Vues matérialisées
Les vues matérialisées sont idéales pour précalculer des agrégations coûteuses, qui seraient traditionnellement effectuées dans des procédures stockées. Si vous utilisez habituellement une base de données traditionnelle, voyez une vue matérialisée comme un déclencheur INSERT qui transforme et agrège automatiquement les données lorsqu’elles sont insérées dans la table source :Vues matérialisées actualisables
Pour le traitement par lots planifié (par exemple, des procédures stockées exécutées chaque nuit) :Orchestration externe
Pour une logique métier complexe, des workflows ETL ou des processus en plusieurs étapes, il est toujours possible d’implémenter cette logique en dehors de ClickHouse, à l’aide de clients par langage.Utiliser du code applicatif
Voici une comparaison, côte à côte, montrant comment une procédure stockée MySQL peut être transposée en code applicatif avec ClickHouse :- Procédure stockée sous MySQL
- Code d’application pour ClickHouse
Différences clés
- Contrôle de flux - Les procédures stockées MySQL utilisent
IF/ELSEet des bouclesWHILE. Dans ClickHouse, implémentez cette logique dans le code applicatif (Python, Java, etc.) - Transactions - MySQL prend en charge
BEGIN/COMMIT/ROLLBACKpour les transactions ACID. ClickHouse est une base de données analytique optimisée pour les charges de travail de type append-only, et non pour les mises à jour transactionnelles - Mises à jour - MySQL utilise des instructions
UPDATE. ClickHouse privilégieINSERTavec ReplacingMergeTree ou CollapsingMergeTree pour les données mutables - Variables et état - Les procédures stockées MySQL peuvent déclarer des variables (
DECLARE v_discount). Avec ClickHouse, gérez l’état dans le code applicatif - Gestion des erreurs - MySQL prend en charge
SIGNALet les gestionnaires d’exceptions. Dans le code applicatif, utilisez le mécanisme natif de gestion des erreurs de votre langage (try/catch)
Utilisation d’outils d’orchestration de workflows
- Apache Airflow - Planifier et surveiller des DAG complexes de requêtes ClickHouse
- dbt - Transformer les données avec des workflows basés sur SQL
- Prefect/Dagster - Orchestration moderne basée sur Python
- Custom schedulers - Tâches cron, Kubernetes CronJobs, etc.
- Toutes les capacités d’un langage de programmation complet
- Meilleure gestion des erreurs et logique de retry
- Intégration avec des systèmes externes (API, autres bases de données)
- Contrôle de version et tests
- Monitoring et alertes
- Planification plus flexible
Alternatives aux requêtes préparées dans ClickHouse
Bien que ClickHouse ne dispose pas de « requêtes préparées » traditionnelles au sens des SGBDR, il propose des paramètres de requête qui remplissent le même rôle : des requêtes sécurisées et paramétrées qui empêchent les injections SQL.Syntaxe
Il existe deux manières de définir des paramètres de requête :Méthode 1 : utilisation de SET
Exemple de table et de données
Exemple de table et de données
Méthode 2 : utiliser des paramètres CLI
Syntaxe des paramètres
Les paramètres sont référencés de la manière suivante :{parameter_name: DataType}
parameter_name- Le nom du paramètre (sans le préfixeparam_)DataType- Le type de données ClickHouse vers lequel caster le paramètre
Exemples de types de données
Tables et données d’exemple
Tables et données d’exemple
- Chaînes et nombres
- Dates et heures
- Arrays
- Maps
- Identifiants
Pour l’utilisation des paramètres de requête dans les clients par langage, consultez la documentation du client pour le langage qui vous intéresse.
Limitations des paramètres de requête
Les paramètres de requête ne sont pas des substitutions de texte universelles. Ils présentent des limites précises :- Ils sont principalement conçus pour les instructions SELECT - la meilleure prise en charge concerne les requêtes SELECT
- Ils fonctionnent comme des identifiants ou des littéraux - ils ne peuvent pas remplacer des fragments SQL arbitraires
- La prise en charge du DDL est limitée - ils sont pris en charge dans
CREATE TABLE, mais pas dansALTER TABLE
Bonnes pratiques de sécurité
Utilisez toujours des paramètres de requête pour les données fournies par l’utilisateur :Requêtes préparées du protocole MySQL
L’interface MySQL de ClickHouse inclut une prise en charge minimale des requêtes préparées (COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE), principalement pour assurer la compatibilité avec des outils comme Tableau Online qui encapsulent les requêtes dans des requêtes préparées.
Limites principales :
- La liaison des paramètres n’est pas prise en charge - Vous ne pouvez pas utiliser de marqueurs
?avec des paramètres liés - Les requêtes sont stockées, mais non analysées lors de
PREPARE - L’implémentation est minimale et conçue pour la compatibilité avec certains outils de BI
Résumé
Alternatives de ClickHouse aux procédures stockées
Utilisation des paramètres de requête
Les paramètres de requête peuvent être utilisés pour :- Prévenir les injections SQL
- Effectuer des requêtes paramétrées avec vérification des types
- Mettre en place un filtrage dynamique dans les applications
- Créer des modèles de requêtes réutilisables
Documentation connexe
CREATE FUNCTION- Fonctions définies par l’utilisateurCREATE VIEW- Vues, y compris les vues paramétrées et matérialisées- Syntaxe SQL - Paramètres de requête - Syntaxe complète des paramètres
- Vues matérialisées en cascade - Modèles avancés de vues matérialisées
- UDF exécutables - Exécution de fonctions externes