
5 ошибок при миграции с PostgreSQL на ClickHouse: как не убить производительность индексами
sproshchaev только что 5 ошибок при миграции с PostgreSQL на ClickHouse: как не убить производительность индексами Средний 10 мин 17 Блог компании OTUS Карьера в IT-индустрии Базы данных * DevOps * Туториал Всем привет,...
В сфере искусственного интеллекта произошло заметное событие. sproshchaev только что 5 ошибок при миграции с PostgreSQL на ClickHouse: как не убить производительность индексами Средний 10 мин 17 Блог компании OTUS Карьера в IT-индустрии Базы данных * DevOps * Туториал Всем привет, меня зовут Сергей Прощаев. В этой статье расскажу про подводные камни индексации при переезде с классических реляционных баз в мир колоночных аналитических СУБД на примере PostgreSQL и ClickHouse. Я Tech Lead и руководитель направления Java/Kotlin разработки в FinTech & E‑commerce, а ещё преподаю на курсах по разработке и архитектуре в OTUS.
За последние пару лет я видел несколько проектов, где команда решила «ускорить аналитику», перетащив часть данных из PostgreSQL в ClickHouse. И почти всегда одно и то же: переносят схему один‑в‑один, создают привычные B‑tree индексы… и получают не ускорение, а головную боль. Сегодня разберём пять конкретных ошибок при работе с индексами в ClickHouse, которые возникают из‑за привычек, унаследованных от PostgreSQL.
Технические детали
И главное — покажу, как их исправить, опираясь на лучшие практики команд. 1 Два мира индексации: B‑tree в PostgreSQL и sparse primary index в ClickHouseПредставьте ситуациюВы — инженер данных или бэкенд‑разработчик. У вас есть боевой PostgreSQL, который отлично справляется с транзакциями.
Но отчёт по продажам за последние три месяца выполняется 40 секунд, а дашборд руководителя грузится вечность. Логичное решение: вынести аналитическую нагрузку в ClickHouse — колоночную СУБД, оптимизированную для агрегаций и больших объёмов чтения. Вы создаёте таблицу в ClickHouse, почти как в PostgreSQL.
Добавляете индексы… и тут начинаются проблемы. Запросы не ускоряются, вставки тормозят, а некоторые индексы вообще игнорируются. Я сам через это проходил.
Отраслевые последствия
В одном проекте мы переносили логи платежей за два года. Сделали «правильный» первичный ключ как в PG — по id транзакции. И получили, что каждый SELECT COUNT(*) сканировал почти все гранулы.
Пришлось перепроектировать, и разница была ощутима в разы. Так что давайте сразу по кочкам. Создавать в ClickHouse обычный B‑tree индексСимптом: Вы пишете CREATE INDEX idx_user ON clicks(user_id).
ClickHouse выполняет команду, но в плане запроса видите Index type: none или Skip: 0. Запрос по user_id всё равно сканирует всю таблицу. Почему возникает: В PostgreSQL B‑tree — это сбалансированное дерево, где каждый лист указывает на конкретную версию строки (ctid).
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.



