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 ответов

7 просмотров

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

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

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

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

Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
А чем вам питонисты не угодили?😂
.
79
Всем привет. Поделитесь, пожалуйста, опытом. Есть форма, на которой имеется dbgrid и кнопки: добавить, редактировать, удалить. Если нет записей в dbgrid, то кнопки редактирова...
Евгений
4
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
83
Вот смотрите у меня есть два стрима сейчас fs, cs: TStream; fs := TFileStream.Create('filename'); cs := TCompressionStream.Create(compression_level, fs); Я хочу сделать так: ...
notme
5
type TExtensions<GExtender>=class function GetExtension<GEntityExtenderType>:GEntityExtenderType; end; function TExtensions<GExtender>.GetExtension<GEntityExtenderType...
zamtmn
8
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Карта сайта