значений в order_by для лучшего сжатия, чем стоит на оригинальной?
В основном репорты создаются за некоторый период времени, собственно в ключе первым будет таймштамп
К примеру на оригинальной стоит time, click_id, user_id
Также в таблицу записываються несколько связанных ивентов почти одновременно, один зависит от другого, и множество полей у них совпадают, и на каждый нужно искать в базе по click_id
Для этого проекции поставить click_id - и далее по мере увеличения cardinality - то есть некое количество всех совпадающих колонок
Есть в этом смысл?
много колонок в ключе сортировки обычно ничего не дают, особенно если в начале стоит что-то высококардинальное, типа timestamp или click_id. Если колонки низкокардиальные - можно 4-6 указать, дальше профита особо не будет. Если первая высококардинальная - вторая колонка уже ничего не даст
create table events () engine = MergeTree PARTITION BY toYYYYMM(toDateTime(time)) ORDER BY (time, sl_click_id, dci, device_id) SETTINGS index_granularity = 8192; Создана проекция PROJECTION events_event_id_pj ( SELECT * ORDER BY sl_click_id ) Задачу решило по поиску единичных записей Но появилась проблема, что теперь проекция ещё используется там где не нужно, а именно во всех запросах, где присутствует фильтрация не только по дефолтному primary key оригинальной таблицы То есть - минимальный кейс explain indexes=1 SElECT distinct e.aff_sub FROM events e WHERE (e.time >= ...) AND (e.time <= ...) Нормально юзает оригинальную таблицу и затрагивает мало гранул explain indexes=1 SElECT distinct e.aff_sub FROM events e WHERE (e.time >= ...) AND (e.time <= ...) AND "e"."event" = 'hit'; Уже использует новую проекцию, хотя под её ключ вообще не попадает, почти все гранулы В чем может быть проблема? Версия 23.6.2.18
На новой версии проверяли?
Обсуждают сегодня