Последнее значение (last value)

526 views
Skip to first unread message

Родион Горбачев

unread,
Sep 19, 2018, 11:09:37 AM9/19/18
to ClickHouse
Здравствуйте.
Приведу пример (моей) задачи но максимально приближу её к задачам Метрики.
Буду признателен за советы.
Существует таблица
UserId(UInt64) | UserGroup(UInt16) | URL(String) | Domain(String) | dt(DateTime)
Таблица содержит десятки миллиардов записей. Количество пользователей - сотни миллионов. Групп пользователей - миллионы. Задача - для определенной группы пользователей (UserGroup) определить ПОСЛЕДНИЙ Domain, для каждого пользователя и посчитать их количество. В принципе - задача довольно простая (используя limit 1 by UserId, или argMax(UserId, dt), или движок AggregatingMergeTree) - у меня не получается достичь приемлемой производительности(< 1 сек) на 8 ядрах и 256 операивки (без кластера) - ClickHouse server version 18.10.3 revision 54405.

Create table user_visits(UserId UInt64, UserGroup UInt16, URL String, Domain String, dt DateTime) Engine=MergeTree parttition by toYYYYMM(dt) order by UserGroup

select -- query execution time > 16 sec
last_domain
, count() as qty
from 
(
select 
UserId
, argMax(Domain, dt) as last_domain
from user_visits
where UserGroup = 0
group by UserId
order by qty 
---------------------------
select -- query execution time > 50 sec
Domain as last_domain
, count() as qty
from 
(
select
Domain
, UserId
from user_visits
where UserGroup = 0
order by dt desc
)
limit 1 by UserId
----------------------------
Помогите пожалуйста найти самый быстрый способ подсчета последнего домена. 
Спасибо.

Denis Zhuravlev

unread,
Sep 19, 2018, 8:49:05 PM9/19/18
to ClickHouse
а почему 16 секунд это много?
С хадупом или др. базой вы бы как раз пообедать успели за время выполнения этого запроса на этом объеме :)

сколько размеры у колонок в сжатом виде ?
select * from system.columns where table = 'user_visits'

Create table user_visits(UserId UInt64, UserGroup UInt16, URL String, Domain String, dt DateTime) Engine=MergeTree parttition by toYYYYMM(dt) order by UserGroup

select -- query execution time > 16 sec
last_domain
, count() as qty
from 
(
select 
UserId
, argMax(Domain, dt) as last_domain
from user_visits
where UserGroup = 0
group by UserId
order by qty

Dmitry Berezhnov

unread,
Sep 21, 2018, 11:16:29 AM9/21/18
to ClickHouse
Если заменить подзапрос

select 
UserId
, argMax(Domain, dt) as last_domain
from user_visits
where UserGroup = 0
group by UserId
на матвьюху с AggregatingMergeTree - как меняется время запроса?
Reply all
Reply to author
Forward
0 new messages