Обсуждаем ClickHouse
судя по query_log на каждой ноде есть такое
/* ddl_entry=query-0000000402 */ EXCHANGE TABLES test.`.tmp.inner_id.9c7165d5-6d16-4952-858b-0c65953c34a2` AND test.table_for_mv
т.е оно как бы RVM выполняет, учитывая что такое есть раз в минуту, но при этом данные не появляются на нодах
> 3-х шардов (6 серверов, 2 реплики на шард,
а тут всего 3 ноды
clusterAllReplicas должен 6 дать
select * from clusterAllReplicas(''{cluster}'', view(select * from system.macros));
Читать полностью…продолжаю держать в курсе событий =)
глючит topK() в комбинации с query_plan_merge_expressions
да, забыл ссылку куда можно скопипастить, если напомните я скину целиком запросы на создания таблиц, так будет больше контекста
UPD: https://pastila.nl/?02a23c6e/62cf8ac3a081830c98c6181e6d2739a9#qDmrsXDm4ru0z9qU9X2k4Q==
запрос вида
WITHЧитать полностью…
substr(SniffleBreadcrumb, 1, 7) AS elevator,
substr(SniffleBreadcrumb, 1, 5) AS calcification,
count(*) AS supermarket
SELECT
h3ToParent(LibidoSomeone, 10) AS lycra,
topK(7)(calcification) AS replacement,
supermarket
FROM merge('excess', 'tuna_gathering_espalier_decryption')
WHERE (ExasperationId > 0) AND (lycra != 0) AND (toDate(GazeboSniffleHonorBay) = '2026-05-02') AND (elevator IN ('QRUAS', 'HXPIQ', 'CCTBX'))
GROUP BY lycra
HAVING sumIf(PopularityLinerXylophone, PopularityLinerXylophone > 0) >= 36
FORMAT Null
create database test on cluster '{cluster}' ENGINE=Replicated('/clickhouse/databases/test','{shard}','{replica}')
Читать полностью…
select sum(id), hostname() from cluster('{cluster}', test.raw_source_local) group by hostname(); - вот так данные есть с каждого сервера
select sum(sum), hostname() from cluster('{cluster}', test.table_for_mv) group by hostname(); а вот тут данные есть только с того сервера где я создавал refreshable MV
ага, я пробовал, так оно создает, но тогда мат вью рефреш запускается на одной ноде и будет обновлять только ее
Читать полностью…SQL Error [22000]: Code: 36. DB::Exception: This combination doesn't work: refreshable materialized view, no APPEND, non-replicated database, replicated table. Each refresh would replace the replicated table locally, but other replicas wouldn't see it. Refusing to create. (BAD_ARGUMENTS) (version 25.5.2.47 (official build))
Читать полностью…О, я придумал! Чтобы добавить недостающие даты можно еще раз наджойнить периоды в конце.
Читать полностью…Так я и говорю что надо другой тип join - cross. В календаре мало строк поэтому это прекрасно работает
Читать полностью…не понятно все равно, пример в https://fiddle.clickhouse.com/ сделайте
как будто вам нужен cross join и фильтры в where
с другой стороны я делал что-то похожее через array join создавая 0 на каждую дату
в смысле нужен join с календарем чтобы 0 отобразить когда данных нет?
Читать полностью…реплики я пока отключил, тут бы разобраться еще с "мастерами"
Читать полностью…cluster mycluster
replica replica_node1
shard shard1
cluster mycluster
replica replica_node2
shard shard2
cluster mycluster
replica replica_node3
shard shard3
mycluster это физический кластер
SELECT cluster, shard_num, replica_num, host_name, host_address, port, is_local
FROM system.clusters WHERE cluster='test';
вот такой запрос дает данные кластера test который база репликейтед
да и как на такое reproduce накручивать тоже та еще боль. слишком специфичная комбинация
надеюсь оптимизации query plan не будут принудительными в будущем
а еще, судя по всему RMV выполняется на каждой ноде, заполняет локальные таблицы, а на остальных нодах данные очищаются, хотя до этого они там были
Читать полностью…>сделал таблицу под MV - создалась - пустая что логично
Replicated ?
query_plan_merge_expressions
если выключить - все ок
значит неправльно добавлены ноды в replicated database
вам надо правильно добавлять реплики, шарды, тогда один раз на шарде на одной из реплик будет запускаться
у вас должна быть replicated database и mat view и trg таблицы должны быть в ней
Читать полностью…Джойн нагенерит декартово произведение, а предикат его так же зафильтрует.
Читать полностью…Фильтр where будет фильтровать уже сджойненные строки, так что нулей не будет все равно.
Читать полностью…Если нужно добавлять недостающие даты то проще всего order by fill
Если отдельно нужно сгенерить данные, то range и array join или numbers
Да. И чтобы группировать по кривым периодам.
Читать полностью…Привет! Спрашивал в англоязычном чате, но там не очень активное сообщество.
Допустим, у меня есть требование: генерировать агрегаты по периодам дат.
SELECTИ получаю
dp.start,
COLESCE(COUNT(d.value), 0) AS some_agg
FROM date_periods dp
LEFT JOIN data d
ON d.date >= dp.start
AND d.date < dp.end
— AND some business predicate
GROUP BY dp.start
Cannot determine keys in JOIN ON expression.
WITH enriched_date_periods AS (Так работает, но есть ли какой-то более изящный способ получить агрегаты? Читать полностью…
SELECT
start,
end,
some_expression as dim_value
FROM date_periods
)
SELECT
dp.start,
COLESCE(COUNT(d.value), 0) AS some_agg
FROM enriched_date_periods dp
LEFT JOIN data d
ON d.date >= dp.start
AND d.date < dp.end
AND d.dim_value = ds.dim_value
— AND some left business predicate
GROUP BY dp.start