Каталог разрезов и измеренный род агрегации
- род метрики выводится сверкой минутного слоя с часовым: часовое значение сходится с суммой минутных — накопительная, со средним — мгновенная, иначе `unknown` и свёртка не предлагается вовсе. На живом архиве (123 доставки, 31 метрика) 7 накопительных, 9 мгновенных, противоречащих часов ноль - `GET /api/v1/metrics` под токеном чтения отдаёт единицы, слои с границами и род вместе с основанием измерения; род нигде не хранится — он функция витрины, а витрина функция журнала, устаревать в нём нечему - миграция 00009: покрывающий индекс, чтобы каталог отвечал по учётным колонкам, не разжимая содержимое объектов
This commit is contained in:
@@ -103,6 +103,16 @@ SQLite (`modernc.org/sqlite`, чистый Go), миграции — goose, фа
|
||||
Таблица `WITHOUT ROWID`: обращение всегда по полному первичному ключу, и
|
||||
лишний уровень косвенности через rowid ни разу не нужен.
|
||||
|
||||
Индекс `bucket_catalog` (`metric, layer, hour_utc, first_ts, last_ts, points,
|
||||
units`) — **покрывающий**, и это следствие той же формы таблицы: у `WITHOUT
|
||||
ROWID` строка целиком, вместе со сжатым `payload`, живёт в дереве первичного
|
||||
ключа, поэтому агрегат «какие слои есть у метрики и за какой период» без индекса
|
||||
тащил бы страницы содержимого — сотни мегабайт чтения на запрос каталога при
|
||||
260 тысячах объектов за год. По нему же идёт поиск часов, за которые у метрики
|
||||
есть объекты сразу в двух слоях. Цена — около 60 байт на объект и одна вставка в
|
||||
дерево на запись; платит её только настоящее изменение, потому что при совпавшем
|
||||
хеше объект не переписывается вовсе.
|
||||
|
||||
**Идентичность точки внутри объекта** — координаты
|
||||
`метрика + слой + начало + конец`, у точки-измерения конец равен началу.
|
||||
`source` в ключ не входит: он нестабилен и переписывается задним числом. При
|
||||
|
||||
Reference in New Issue
Block a user