Всем привет. Помогите, пожалуста.
Имеются таблицы вида:
CREATE TABLE data.user_contacts
( date UInt32, user_id UInt32, site_id UInt32, timespan_start UInt32, timespan_end UInt32, timestamp_start DateTime, timestamp_end DateTime, date_day Date MATERIALIZED toDate(concat(substring(toString(date), 1, 4), '-', substring(toString(date), 5, 2), '-', substring(toString(date), 7, 2))))
ENGINE = MergeTree
PARTITION BY (date_day, site_id)
ORDER BY (date_day, site_id, timespan_start, timespan_end) SETTINGS index_granularity = 8192
CREATE TABLE data.events
( event_id String, site_id UInt32, date UInt32, timestamp_start DateTime, timestamp_end DateTime, quantity UInt32, total_event_id_duration UInt32, event_duration Int32 MATERIALIZED timestamp_end - timestamp_start, date_day Date MATERIALIZED toDate(concat(substring(toString(date), 1, 4), '-', substring(toString(date), 5, 2), '-', substring(toString(date), 7, 2))))
ENGINE = MergeTree
PARTITION BY date_day
ORDER BY (date_day, site_id, timestamp_start, timestamp_end, event_id) SETTINGS index_granularity = 8192
И запрос:
SELECT
event_id,
user_id,
date_day,
event_duration,
least(
timestamp_end,
timestamp_end_event
)- greatest(
timestamp_start,
timestamp_start_event
) AS intersected_duration,
total_event_id_duration
FROM
data.user_contacts ALL
INNER JOIN(
SELECT
events.event_id,
events.site_id,
events.date_day,
events.quantity,
events.timestamp_start AS timestamp_start_event,
events.timestamp_end AS timestamp_end_event,
event_duration,
total_event_id_duration
FROM
data.events
) events
USING(
date_day,
site_id
)
WHERE
date_day BETWEEN '2017-01-01' AND '2017-01-31'
AND
timestamp_start < timestamp_end_event
AND
timestamp_start_event < timestamp_end
Проблема заключается в большом потреблении оперативной памяти
Для справки:
1) ClickHouse server version 1.1.54380.
2) Данных в таблице data.user_contacts намного больше, чем информации в data.events
3) Индексы по непонятной причине используются только для ограничения data.user_contacts по датам и не участвуют в join
4) Пробовал создавать и такой индекс: (date_day, site_id) - результат не отличается от п.3
Подскажите, пожалуйста, как максимально эффективно соединить 2 таблицы по пересекающимся временным интервалам?
Мускуль легко масштабируется на чтение. Добавьте n слейвов