Skip to main content
Si vous venez d’une base de données relationnelle traditionnelle, vous cherchez peut-être des procédures stockées et des requêtes préparées dans ClickHouse. Ce guide explique l’approche de ClickHouse vis-à-vis de ces concepts et propose des alternatives recommandées.

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
Les procédures stockées avec une logique procédurale vont à l’encontre de ces optimisations. À la place, ClickHouse propose des alternatives qui correspondent à ses points forts.

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 :
Limitations :
  • 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
Voir 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 :
Les UDF exécutables peuvent implémenter n’importe quelle logique dans n’importe quel langage (Python, Node.js, Go, etc.). Consultez les UDF exécutables pour plus de détails.

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 :

Cas d’usage courants

Consultez la section Vues paramétrées pour plus d’informations.

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) :
Voir Vues matérialisées en cascade pour des modèles avancés.

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 :

Différences clés

  1. Contrôle de flux - Les procédures stockées MySQL utilisent IF/ELSE et des boucles WHILE. Dans ClickHouse, implémentez cette logique dans le code de votre application (Python, Java, etc.)
  2. Transactions - MySQL prend en charge BEGIN/COMMIT/ROLLBACK pour les transactions ACID. ClickHouse est une base de données analytique optimisée pour les workloads de type append-only, et non pour les mises à jour transactionnelles
  3. Mises à jour - MySQL utilise des instructions UPDATE. ClickHouse privilégie INSERT avec ReplacingMergeTree ou CollapsingMergeTree pour les données mutables
  4. 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 de votre application
  5. Gestion des erreurs - MySQL prend en charge SIGNAL et les gestionnaires d’exceptions. Dans le code de l’application, utilisez le mécanisme natif de gestion des erreurs de votre langage (try/catch)
Quand utiliser chaque approche :
  • Workloads OLTP (commandes, paiements, comptes utilisateurs) → Utilisez MySQL/PostgreSQL avec des procédures stockées
  • Workloads analytiques (reporting, agrégations, séries temporelles) → Utilisez ClickHouse avec une orchestration au niveau de l’application
  • Architecture hybride → Utilisez les deux ! Acheminez en continu les données transactionnelles d’OLTP vers ClickHouse pour l’analytique

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.
Avantages de l’orchestration externe :
  • 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

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éfixe param_)
  • DataType - Le type de données ClickHouse vers lequel caster le paramètre

Exemples de types de données


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 :
  1. Ils sont principalement conçus pour les instructions SELECT - la meilleure prise en charge concerne les requêtes SELECT
  2. Ils fonctionnent comme des identifiants ou des littéraux - ils ne peuvent pas remplacer des fragments SQL arbitraires
  3. La prise en charge du DDL est limitée - ils sont pris en charge dans CREATE TABLE, mais pas dans ALTER TABLE
Ce qui FONCTIONNE :
Ce qui NE fonctionne PAS :

Bonnes pratiques de sécurité

Utilisez toujours des paramètres de requête pour les données fournies par l’utilisateur :
Valider les types d’entrée :

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
Exemple de ce qui ne fonctionne pas :
Utilisez plutôt les paramètres de requête natifs de ClickHouse. Ils offrent une prise en charge complète de la liaison des paramètres, un typage sûr et une protection contre les injections SQL sur toutes les interfaces ClickHouse :
Pour plus de détails, consultez la documentation de l’interface MySQL ainsi que l’article de blog sur la prise en charge de MySQL.

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
Dernière modification le 3 juillet 2026