Как стать автором
Обновить

Комментарии 15

Можно еще проще и быстрее

select CounterID, url FROM
(
select CounterID, arraySlice(arrayFilter(x -> (x.2) like '%yandex.ru%', arraySort(x-> x.1, groupArray(tuple(ClientEventTime, StartURL)))),1,10).2 as urls
FROM visits_v1
--where UserID = 5732566399506708088 фильтр по пользователю при желании
GROUP BY CounterID
HAVING count() > 2
)
array join urls as url

Получаем первые 10 url пользователя в которых есть подстрока yandex.ru для счетчиков у которых у него есть 3 или больше записей. Вроде как у вас условие. Если надо вывести другое поле, то его можно запихнуть в тот же тупл.

Пример тут работает https://play.clickhouse.com

Ваш запрос решает немного другую задачу. У вас сортируется и ограничивается для каждого CouterId (session_id в моем случае) отдельно, а у меня на все сессии. Т.е.в результате мой запрос вернет всего 10 записей, а ваш по 10 записей для каждой сессии (CounerId)

Точно. Немного не так понял.

Гипотеза - а если бы в Postgres поменять схему сущностей на ту, что применялась для ClickHouse, но на ClickHouse не переходить - а вдруг это тоже дало бы ускорение, но с меньшим гемором?

PostgreSQL
Количество сообщений в таблице message
Распределение количества сообщений по годам
Распределение количества сообщений по месяцам

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


Странно, что уже сразу кубернетес и hadoop стек не стали завозить.


На эту тему есть прекрасная статья — https://blog.bradfieldcs.com/you-are-not-google-84912cf44afb

С чего же вы взяли, что мы не пробовали другие методы постгреса. Я вскользь упомянул это во введении. Они либо нам не помогали, либо помогали недостаточно или не для всех кейсов.

К сожалению нет. Основная проблема не в том, что в pg множество таблиц, а в том, что долгое чтение всех данных. Например, в секции "Простые аналитические запросы" замеряется время на одной таблице без всяких join'ов, на этом примере схема не важна.

Спасибо за статью, но осталось несолько вопросов.
Аналитику пернесли, а остальное осталось в PG ? Или это изначально чисто аналитическая БД была ? Если чисто аналитическая, то почему выбрали PG изначально ?
Как загружаете данные в Clickhouse ?

Аналитика была частью достаточно большой схемы, вынесли только ее. Почему изначально выбрали PG сказать не могу, было до меня. Думаю на ранних этапах продукта пошли по пути наименьшего сопротивления и добавили функционал в существующую схему.

По поводу загрузки данных в ClickHouse. Данные аналитики у нас отправляют несколько сервисов в небольшой сервис очередь (самописная kafka на минималках). Новый сервис для аналитики периодически вытягивает эти данные батчами и записывает в ClickHouse.

Дополню относительно загрузки данных. Перед тем как загрузить пачку данных, мы делаем select по id и вставляем только те данные, которых еще в CH нет. Такой нехитрый способ позволяет убедиться в отсутствии дублирования данных аналитики.

А почему сравнение производилось с ванильным PostgreSQL, а не с cstore_fdw от Citus Data?

Тоже хотел спросить про это.

В последних версиях Citus Data добавили колоночное хранилище. Ограничения у него плюс-минус такие же как у ClickHouse. Например нельзя обновлять данные. Но за счёт использования партицирования таблицы, можно "горячие" данные держать в part-е с обычным строковым хранилищем, а "холодные" part-ы переводить в колоночное хранилище с получением всех его преимуществ.

Сравнение производилось с обычным PostgreSQL, так как целью статьи было показать как мы переходили с текущей реализации на колоночную, а не сравнить аналитические бд.

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

Обратил внимание, что почти все запросы идут по timestamp. Отсюда резонный вопрос. А чем TimeScaleDB не угодил? В нем таблицы client и session можно было бы иметь в виде materialized views в реальном времени актуализируемые механизмом сontinuous aggregates. А производительность у гипертаблиц TimeScaleDB выше, чем у обычных таблиц, не менее, чем на порядок.

Не помню чтобы рассматривали TimeScaleDB и так как не погружался в его работу сейчас не готов утверждать подошел бы он нам или нет. На первый взгляд не очень подходит, но возможно ошибаюсь. Спасибо за вопрос.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.