Перейти к основному содержанию
В предыдущем разделе вы подключили ClickHouse к каталогу данных и выполняли запросы к открытым табличным форматам напрямую. Хотя такой подход удобен, открытые табличные форматы не оптимизированы для рабочих нагрузок с низкой задержкой и высоким параллелизмом, характерных для панелей мониторинга и операционной отчётности. В таких сценариях загрузка данных в движок MergeTree ClickHouse даёт значительно более высокую производительность. У MergeTree есть несколько преимуществ по сравнению с прямым чтением открытых табличных форматов:
  • разреженный первичный индекс - Упорядочивает данные на диске по выбранному ключу, благодаря чему ClickHouse может пропускать большие диапазоны нерелевантных строк при выполнении запросов.
  • Расширенные типы данных - Встроенная поддержка таких типов, как JSON, LowCardinality и Enum, обеспечивает более компактное хранение и более быструю обработку.
  • Индексы пропуска и полнотекстовые индексы - Вторичные индексные структуры, которые позволяют ClickHouse пропускать гранулы, не соответствующие предикатам фильтра в запросе; это особенно эффективно для рабочих нагрузок текстового поиска.
  • Быстрые вставки с автоматической компакцией - ClickHouse рассчитан на вставки с высокой пропускной способностью и автоматически выполняет слияние частей данных в фоновом режиме, аналогично compaction в открытых табличных форматах.
  • Оптимизировано для параллельного чтения - Столбцовая структура хранения MergeTree в сочетании с несколькими уровнями кэширования поддерживает аналитические рабочие нагрузки в реальном времени с высоким параллелизмом — то, для чего открытые табличные форматы не предназначены.
В этом руководстве показано, как загружать данные из каталога в таблицу MergeTree с помощью INSERT INTO SELECT, чтобы ускорить аналитику.

Подключение к каталогу

Мы будем использовать то же подключение к Unity Catalog из предыдущего руководства и подключаться через конечную точку Iceberg REST:

Список таблиц

Изучите схему

Эта таблица содержит ~283 миллиона строк логов из тестовых запусков ClickHouse CI — реалистичный набор данных для оценки производительности аналитических запросов.

Запрос к таблице озера данных

Выполним запрос, который фильтрует журналы по имени потока и типу инстанса, ищет в тексте сообщения ошибки и группирует результаты по логгеру:
Запрос выполняется почти 9 секунд, потому что ClickHouse приходится полностью сканировать таблицу по всем файлам Parquet в объектном хранилище. Производительность можно было бы повысить с помощью партиционирования, но у столбцов вроде logger_name может быть слишком высокая мощность, чтобы партиционирование было эффективным. У нас также нет индексов, таких как Текстовые индексы, чтобы ещё сильнее отсекать данные. Именно здесь MergeTree показывает себя лучше всего.

Загрузите данные в MergeTree

Создание оптимизированной таблицы

Создадим таблицу MergeTree, немного оптимизировав схему. Обратите внимание на несколько ключевых отличий от схемы Iceberg:
  • Без обёрток Nullable — отказ от Nullable повышает эффективность хранения и производительность запросов.
  • LowCardinality(String) для столбцов level, instance_type, thread_name и check_name — использует словарное кодирование для столбцов с небольшим числом различных значений, что улучшает сжатие и ускоряет фильтрацию.
  • полнотекстовый индекс для столбца message — ускоряет полнотекстовый поиск по токенам, например hasToken(message, 'error').
  • Ключ ORDER BY (instance_type, thread_name, toStartOfMinute(event_time)) — организует данные на диске в соответствии с типичными условиями фильтрации, чтобы разреженный первичный индекс мог пропускать нерелевантные гранулы.

Вставка данных из каталога

Используйте INSERT INTO SELECT, чтобы загрузить ~300 млн строк из таблицы озера данных в нашу таблицу ClickHouse:

Выполните запрос повторно

Если теперь снова выполнить тот же запрос к таблице MergeTree, мы увидим, что производительность значительно возрастет:
Теперь тот же запрос выполняется за 0,22 секундыпримерно в 40 раз быстрее. Это улучшение обеспечивают две ключевые оптимизации:
  • Разреженный первичный индекс - ключ ORDER BY (instance_type, thread_name, ...) означает, что ClickHouse может сразу перейти к гранулам, соответствующим instance_type = 'm6i.4xlarge' и thread_name = 'TCPHandler', сократив число обрабатываемых строк с 283 миллионов до всего 14 миллионов.
  • Полнотекстовый индекс - индекс text_idx для столбца message позволяет обрабатывать hasToken(message, 'error') по индексу, а не сканировать каждое сообщение целиком, что ещё больше уменьшает объём данных, которые ClickHouse нужно прочитать.
В результате получается запрос, который без проблем может обеспечивать работу панели мониторинга в реальном времени — в масштабе и с задержкой, недостижимыми для запросов к файлам Parquet в Объектном хранилище.
Последнее изменение 10 июня 2026 г.