Альтернативы хранимым процедурам в ClickHouse
IF/ELSE, циклы и т. д.).
Это осознанное решение, обусловленное архитектурой ClickHouse как аналитической базы данных.
В аналитических базах данных циклы не рекомендуются, поскольку выполнение O(n) простых запросов обычно медленнее, чем выполнение меньшего числа более сложных запросов.
ClickHouse оптимизирован для:
- Аналитических нагрузок - Сложных агрегаций на больших наборах данных
- Пакетной обработки - Эффективной работы с большими объёмами данных
- Декларативных запросов - SQL-запросов, которые описывают, какие данные нужно получить, а не как их обрабатывать
Пользовательские функции (UDFs)
UDF на основе лямбда-выражений
Тестовые данные для примеров
Тестовые данные для примеров
- Нет циклов и сложного управления потоком
- Нельзя изменять данные (
INSERT/UPDATE/DELETE) - Рекурсивные функции не поддерживаются
CREATE FUNCTION.
Исполняемые UDF
Параметризованные представления
Тестовые данные для примера
Тестовые данные для примера
Распространённые варианты использования
- Динамическая фильтрация по диапазону дат
- Сегментация данных по пользователям
- Доступ к данным в многопользовательской среде
- Шаблоны отчётов
- Маскирование данных
Materialized views
Refreshable materialized views
Внешняя оркестрация
Использование прикладного кода
- Хранимая процедура в MySQL
- Прикладной код ClickHouse
Ключевые различия
- Управляющий поток - Хранимые процедуры MySQL используют
IF/ELSEи циклыWHILE. В ClickHouse эту логику следует реализовывать в прикладном коде (Python, Java и т. д.) - Транзакции - MySQL поддерживает
BEGIN/COMMIT/ROLLBACKдля ACID-транзакций. ClickHouse — аналитическая база данных, оптимизированная для рабочих нагрузок с добавлением данных, а не для транзакционных обновлений - Обновления - MySQL использует операторы
UPDATE. В ClickHouse для изменяемых данных предпочтительнееINSERTс ReplacingMergeTree или CollapsingMergeTree - Переменные и состояние - Хранимые процедуры MySQL могут объявлять переменные (
DECLARE v_discount). В ClickHouse состоянием следует управлять в прикладном коде - Обработка ошибок - MySQL поддерживает
SIGNALи обработчики исключений. В прикладном коде используйте встроенные в язык средства обработки ошибок (try/catch)
Использование инструментов оркестрации рабочих процессов
- Apache Airflow - Планирование и мониторинг сложных DAG с запросами ClickHouse
- dbt - Преобразование данных с помощью SQL-ориентированных рабочих процессов
- Prefect/Dagster - Современные средства оркестрации на Python
- Custom schedulers - задания cron, Kubernetes CronJobs и т. д.
- Полная мощь языков программирования
- Более удобная обработка ошибок и логика повторных попыток
- Интеграция с внешними системами (API, другими базами данных)
- Контроль версий и тестирование
- Мониторинг и оповещения
- Более гибкое планирование
Альтернативы подготовленным операторам в ClickHouse
Синтаксис
Способ 1: с помощью SET
Пример таблицы и данных
Пример таблицы и данных
Метод 2: с использованием параметров CLI
Синтаксис параметров
{parameter_name: DataType}
parameter_name- имя параметра (без префиксаparam_)DataType- тип данных ClickHouse, к которому нужно привести параметр
Примеры типов данных
Таблицы и тестовые данные для примера
Таблицы и тестовые данные для примера
- Строки & числа
- Даты & время
- Массивы
- Map
- Идентификаторы
О том, как использовать параметры запроса в клиентских библиотеках, см. документацию для конкретного клиента, который вас интересует.
Ограничения параметров запроса
- Они в первую очередь предназначены для операторов SELECT — лучше всего поддерживаются в запросах SELECT
- Они работают как идентификаторы или литералы — ими нельзя подставлять произвольные фрагменты SQL
- У них ограниченная поддержка DDL — они поддерживаются в
CREATE TABLE, но не вALTER TABLE
Рекомендации по безопасности
Подготовленные операторы в протоколе MySQL
COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE) лишь в минимальном объёме — в первую очередь чтобы обеспечить совместимость с такими инструментами, как Tableau Online, которые оборачивают запросы в подготовленные операторы.
Ключевые ограничения:
- Привязка параметров не поддерживается — нельзя использовать плейсхолдеры
?со связанными параметрами - Запросы сохраняются, но не разбираются на этапе
PREPARE - Реализация минимальна и рассчитана на совместимость с конкретными BI-инструментами
Кратко
Альтернативы хранимым процедурам в ClickHouse
Использование параметров запроса
- Предотвращения SQL-инъекций
- Параметризованных запросов с контролем типов
- Динамической фильтрации в приложениях
- Повторного использования шаблонов запросов
CREATE FUNCTION- Пользовательские функцииCREATE VIEW- Представления, включая параметризованные и materialized view- Синтаксис SQL — параметры запроса - Полный синтаксис параметров
- Каскадные materialized view - Продвинутые шаблоны materialized view
- Исполняемые UDF - Выполнение внешних функций