184 похожих чатов

Коллеги, подскажите, пожалуйста: 1) Есть исходный MV с данными вида entity_id, ts

(время получения данных), data_* (много разных полей int/string)

данные постоянно докидываются и образуются дубли по entity_id

для работы необходима только последняя версия данных для каждого entity_id.


2) Для получения последней версии данных делаю MV AggregatingMergeTree таким запросом:

CREATE MATERIALIZED VIEW test_amt
ENGINE = AggregatingMergeTree()
PARTITION BY tuple() ORDER BY (entity_id)
AS
SELECT
argMaxState(id, ts) AS id,
entity_id,
argMaxState(data_version, ts) AS data_version,
{еще примерно 10 полей через argMaxState},
minState(ts) AS min_ts,
maxState(ts) AS max_ts
FROM test
GROUP BY entity_id

3) вставляю исторические данные в amt (insert into select ... from)

4) Поверх делаю вьюху

CREATE VIEW test_view
AS
select
argMaxMerge(id) as id,
entity_id,
argMaxMerge(tracker_sid) as tracker_sid,
argMaxMerge(action) as action,
argMaxMerge(data_version) as data_version,
{еще примерно 10 полей через argMaxState},
argMaxMerge(ts_action) as ts_action,
minMerge(min_ts) as min_ts_captured,
maxMerge(max_ts) as max_ts_captured
from test_amt
group by entity_id

5) Вижу, что данные схлопнулись:

select count() from test
140466
15ms

select count() from test_view
125970
65ms

6) Проблема в том, что при запросах к test_view с указанием фильтрации хотя бы по одному полю скорость выборки значительно падает, до 300-400ms.
Пример запроса (в результатах выборки ~350 строк):
SELECT data_job_id,
data_city_id,
data_job_type,
data_state_id,
data_private,
data_archived,
data_created_at
FROM
test_view
WHERE
tracker_sid = 'test_42055b08-25cf-4e89-aa86-0eedd36a4e17'

376ms

--
Вопрос такой - как можно улучшить быстродействие, на что обратить внимание? Количество записей очень мало, а скорость кажется совершенно неприемлемой.

2 ответов

15 просмотров

какая версия КХ? Что будет если WHERE tracker_sid заменить на PREWHERE WHERE tracker_sid = чему равно SELECT * FROM system.settings WHERE name LIKE '%predicat%'

ааа, ясно, argMaxMerge(tracker_sid) as tracker_sid т.е. для этой вью надо всю таблицу прочитать, сгруппировать и потом уже фильтровать. Естественно медленно.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта