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

Всем привет! Есть таблица с динамикой и два запроса от фронта: 1)

показать динамику + значение за 12 месяцев по месяцам [ currentMonth - 12, currentMonth - 1 ]
2) показать динамику + значение за прошлый месяц по дням

* значение = sum(prev.delta) + sum(current.delta)

Исходя из того что значение на конкретный день получается суммой всех прошлых + текущее использую runningAccumulate.

Исходной таблица MergeTree:

CREATE TABLE dynamic (
`_id` String,
`date` DateTime,
`delta` UInt64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY
(_id, date) SETTINGS index_granularity = 8192

На исходной таблице dynamic, если верить табиксу, получаются такие затраты:

0.01 sec.| 407,073 rows.| 14 MB

При том что размер самой таблицы 16793961 rows
И для конкретного _id +- 152 rows

Не смотря на то, что время выполнения огонь и 14мб не ощущаются на сервере с 252 рам, решил все же улучшить.

Для решения решил оставить dynamic как таблицу с исходными данными и аггрегировать их в таблице с движком SummingMergeTree.

CREATE TABLE test_dynamic_sum (
`_id` String,
`date` Date,
`delta` Int64
) ENGINE = SummingMergeTree()
PARTITION BY toStartOfYear(date)
PRIMARY KEY _id
ORDER BY
(_id, multiIf(date < toStartOfMonth(addMonths(today(), -12)), toStartOfYear(date),date < toStartOfMonth(addMonths(today(), -1)), toStartOfMonth(date), toDate(date)))
SETTINGS index_granularity = 128;

Залил в нее тестовых данных:
- уникальных _id 1000000
- на каждый день в промежутке [2018-01-01,2020-12-31] для каждого _id создал запись
Получилось общее количество записей: 1096000000
Каждый _id имеет: 1096 rows

Опять же, если верить табиксу, то затраты стали такими:

0.00 sec.| 1,537 rows.| 25 KB


Вопросы:

1) Как правильно рассчитать index_granularity ?
В test_dynamic_sum рассчитывал его как сумма дней за два месяца (31+31) + немного с запасом
2) ORDER BY в test_dynamic_sum схлопывает данные так как я и хотел, но не станет ли работать по другому в дальнейшем и будет ли и дальше схлопывать данные корректно?
Слишком уж идеальный результат получился

1 ответов

10 просмотров

тебе нужно доставать для конкретного id только?

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
Тут кста кто-нибудь NeoVim использует?
Simple Sorcerer
13
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
Почему никто не подсказал, что можно объявить свои типы данных, в которых меньше полей, чем в отданном джейсоне, и добавлять их по необходимости?
Strange Rabbit
10
Хтось використовував Vapor на Windows?
Jaroshevskii
15
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Карта сайта