Перейти к основному содержанию
Если вы переходите с традиционной реляционной базы данных, возможно, вы ищете в ClickHouse хранимые процедуры и подготовленные операторы. В этом руководстве объясняется подход ClickHouse к этим концепциям и приводятся рекомендуемые альтернативы.

Альтернативы хранимым процедурам в ClickHouse

ClickHouse не поддерживает традиционные хранимые процедуры с логикой управления потоком выполнения (IF/ELSE, циклы и т. д.). Это осознанное решение, обусловленное архитектурой ClickHouse как аналитической базы данных. В аналитических базах данных циклы не рекомендуются, поскольку выполнение O(n) простых запросов обычно медленнее, чем выполнение меньшего числа более сложных запросов. ClickHouse оптимизирован для:
  • Аналитических нагрузок - Сложных агрегаций на больших наборах данных
  • Пакетной обработки - Эффективной работы с большими объёмами данных
  • Декларативных запросов - SQL-запросов, которые описывают, какие данные нужно получить, а не как их обрабатывать
Хранимые процедуры с процедурной логикой идут вразрез с этими принципами оптимизации. Вместо них ClickHouse предлагает альтернативы, которые лучше соответствуют его сильным сторонам.

Пользовательские функции (UDFs)

Пользовательские функции позволяют инкапсулировать повторно используемую логику без использования конструкций управления потоком. ClickHouse поддерживает два типа:

UDF на основе лямбда-выражений

Создавайте функции с помощью SQL-выражений и синтаксиса лямбда-выражений:
Ограничения:
  • Нет циклов и сложного управления потоком
  • Нельзя изменять данные (INSERT/UPDATE/DELETE)
  • Рекурсивные функции не поддерживаются
Полный синтаксис см. в CREATE FUNCTION.

Исполняемые UDF

Для более сложной логики используйте исполняемые UDF, которые вызывают внешние программы:
Исполняемые UDF могут реализовывать произвольную логику на любом языке программирования (Python, Node.js, Go и т. д.). Подробности см. в разделе Исполняемые UDF.

Параметризованные представления

Параметризованные представления работают как функции, возвращающие наборы данных. Они идеально подходят для повторно используемых запросов с динамической фильтрацией:

Распространённые варианты использования

Дополнительные сведения см. в разделе Параметризованные представления.

Materialized views

Materialized views идеально подходят для предварительного вычисления ресурсоёмких агрегаций, которые в традиционных базах данных обычно выполняются в хранимых процедурах. Если вы привыкли к традиционным базам данных, воспринимайте materialized view как INSERT trigger, который автоматически преобразует и агрегирует данные по мере их вставки в исходную таблицу:

Refreshable materialized views

Для пакетной обработки по расписанию (например, для ночных хранимых процедур):
См. Каскадные materialized view для более сложных сценариев.

Внешняя оркестрация

Для сложной бизнес-логики, ETL-процессов или многоэтапных процессов логику всегда можно реализовать вне ClickHouse, используя клиентские библиотеки.

Использование прикладного кода

Ниже приведено наглядное сравнение того, как хранимая процедура MySQL реализуется в виде прикладного кода при работе с ClickHouse:

Ключевые различия

  1. Управляющий поток - Хранимые процедуры MySQL используют IF/ELSE и циклы WHILE. В ClickHouse эту логику следует реализовывать в прикладном коде (Python, Java и т. д.)
  2. Транзакции - MySQL поддерживает BEGIN/COMMIT/ROLLBACK для ACID-транзакций. ClickHouse — аналитическая база данных, оптимизированная для рабочих нагрузок с добавлением данных, а не для транзакционных обновлений
  3. Обновления - MySQL использует операторы UPDATE. В ClickHouse для изменяемых данных предпочтительнее INSERT с ReplacingMergeTree или CollapsingMergeTree
  4. Переменные и состояние - Хранимые процедуры MySQL могут объявлять переменные (DECLARE v_discount). В ClickHouse состоянием следует управлять в прикладном коде
  5. Обработка ошибок - MySQL поддерживает SIGNAL и обработчики исключений. В прикладном коде используйте встроенные в язык средства обработки ошибок (try/catch)
Когда использовать каждый подход:
  • OLTP-нагрузки (заказы, платежи, учетные записи пользователей) → Используйте MySQL/PostgreSQL с хранимыми процедурами
  • Аналитические нагрузки (отчетность, агрегации, временные ряды) → Используйте ClickHouse с оркестрацией на уровне приложения
  • Гибридная архитектура → Используйте оба варианта! Передавайте транзакционные данные из OLTP в ClickHouse для аналитики

Использование инструментов оркестрации рабочих процессов

  • Apache Airflow - Планирование и мониторинг сложных DAG с запросами ClickHouse
  • dbt - Преобразование данных с помощью SQL-ориентированных рабочих процессов
  • Prefect/Dagster - Современные средства оркестрации на Python
  • Custom schedulers - задания cron, Kubernetes CronJobs и т. д.
Преимущества внешней оркестрации:
  • Полная мощь языков программирования
  • Более удобная обработка ошибок и логика повторных попыток
  • Интеграция с внешними системами (API, другими базами данных)
  • Контроль версий и тестирование
  • Мониторинг и оповещения
  • Более гибкое планирование

Альтернативы подготовленным операторам в ClickHouse

Хотя в ClickHouse нет традиционных «подготовленных операторов» в смысле СУБД, он поддерживает параметры запроса, которые выполняют ту же задачу: позволяют создавать безопасные параметризованные запросы и предотвращать SQL-инъекции.

Синтаксис

Существует два способа задать параметры запроса:

Способ 1: с помощью SET

Метод 2: с использованием параметров CLI

Синтаксис параметров

Для обращения к параметрам используется запись: {parameter_name: DataType}
  • parameter_name - имя параметра (без префикса param_)
  • DataType - тип данных ClickHouse, к которому нужно привести параметр

Примеры типов данных


О том, как использовать параметры запроса в клиентских библиотеках, см. документацию для конкретного клиента, который вас интересует.

Ограничения параметров запроса

Параметры запроса — не универсальные текстовые подстановки. У них есть определённые ограничения:
  1. Они в первую очередь предназначены для операторов SELECT — лучше всего поддерживаются в запросах SELECT
  2. Они работают как идентификаторы или литералы — ими нельзя подставлять произвольные фрагменты SQL
  3. У них ограниченная поддержка DDL — они поддерживаются в CREATE TABLE, но не в ALTER TABLE
Что РАБОТАЕТ:
Что НЕ работает:

Рекомендации по безопасности

Всегда используйте параметры запроса для данных, вводимых пользователем:
Проверяйте типы входных данных:

Подготовленные операторы в протоколе MySQL

Интерфейс MySQL в ClickHouse поддерживает подготовленные операторы (COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE) лишь в минимальном объёме — в первую очередь чтобы обеспечить совместимость с такими инструментами, как Tableau Online, которые оборачивают запросы в подготовленные операторы. Ключевые ограничения:
  • Привязка параметров не поддерживается — нельзя использовать плейсхолдеры ? со связанными параметрами
  • Запросы сохраняются, но не разбираются на этапе PREPARE
  • Реализация минимальна и рассчитана на совместимость с конкретными BI-инструментами
Пример того, что не работает:
Вместо этого используйте собственные параметры запросов ClickHouse. Они обеспечивают полную поддержку привязки параметров, типобезопасность и защиту от SQL-инъекций во всех интерфейсах ClickHouse:
Подробнее см. документацию по интерфейсу MySQL и статью в блоге о поддержке MySQL.

Кратко

Альтернативы хранимым процедурам в ClickHouse

Использование параметров запроса

Параметры запроса можно использовать для:
  • Предотвращения SQL-инъекций
  • Параметризованных запросов с контролем типов
  • Динамической фильтрации в приложениях
  • Повторного использования шаблонов запросов
Последнее изменение 12 июня 2026 г.