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

Всем Привет! Ребят, помогите, а то я застрял и не могу

разобраться

Есть вот такая таблица:
CREATE TABLE telemetry
(
...
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(timestamp)
PRIMARY KEY (target, schema_path, restconf_path, timestamp)
ORDER BY (target, schema_path, restconf_path, timestamp)
SETTINGS index_granularity = 32768;


и вот такой запрос:
EXPLAIN indexes = 1
SELECT
restconf_path,
toStartOfInterval(timestamp, toIntervalSecond(86400)) AS ts,
MAX(value) AS value,
FROM telemetry
WHERE (target = 'some string')
AND (schema_path LIKE 'some string%')
AND (restconf_path LIKE 'some string%')
AND (ts >= FROM_UNIXTIME(1659916800))
AND (ts <= FROM_UNIXTIME(1661040000))
GROUP BY
restconf_path,
ts

┌─explain─────────────────────────────────────────────────────────────────────────┐
│ Expression ((Projection + Before ORDER BY)) │
│ Aggregating │
│ Expression (Before GROUP BY) │
│ Filter (WHERE) │
│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │
│ ReadFromMergeTree │
│ Indexes: │
│ MinMax │
│ Condition: true │
│ Parts: 39/39 │
│ Granules: 8599636/8599636 │
│ Partition │
│ Condition: true │
│ Parts: 39/39 │
│ Granules: 8599636/8599636 │
│ PrimaryKey │
│ Keys: │
│ target │
│ schema_path │
│ restconf_path │
│ Condition: and((schema_path in ['some string'...), │
│ and(and((restconf_path in ['some string'...)), │
│ (target in ['some string'...])), │
│ (schema_path in ['some string'...)))) │
│ Parts: 33/39 │
│ Granules: 42/8599636 │
└─────────────────────────────────────────────────────────────────────────────────┘


Почему запрос сканит все 8599636 гранул в MinMax и Partition индексах? Как это вылечить?

10 ответов

12 просмотров

он не сканит все гранулы, он взял 42 гранулы по primary индексу можете использовать explain estimate, он покажет количество просканированных строк

> Почему запрос сканит все 8599636 гранул в MinMax и Partition индексах? индексов у вас нет, а timestamp (по которому сделано партиционирование) не входит в where. Поэтому осталась только отсечка по первичному индексу > Как это вылечить? А надо? Но если хочется, то можно разобраться чем отличается ts от timestamp и нельзя ли их заменить или в partition by или в where

ph1lm- Автор вопроса
Boris
> Почему запрос сканит все 8599636 гранул в MinMax...

ts вычисляется с timestamp-a toStartOfInterval(timestamp, toIntervalSecond(86400)) AS ts

ph1lm- Автор вопроса
ivan
он не сканит все гранулы, он взял 42 гранулы по pr...

ох вот это я не посмотрел 👍 спасибо

ph1lm
ts вычисляется с timestamp-a toStartOfInterval(tim...

так default не гарантирует что ts вычислен из timestamp, вы можете в ts что угодно положить, вам надо просто добавить в partition by PARTITION BY (toYYYYMM(timestamp), toYYYYMM(ts ))

ph1lm- Автор вопроса
Denny [Altinity]
так default не гарантирует что ts вычислен из time...

Ts вычисляется в запросе. Partition by в объявлении таблицы. Вы предлагаете добавить materialized поле в таблицу?

ph1lm
Ts вычисляется в запросе. Partition by в объявлени...

Нет. Я предлагаю понять как работает partition pruning.

ph1lm- Автор вопроса
Denny [Altinity]
Нет. Я предлагаю понять как работает partition pr...

Я с удовольствием в этом разберусь, но по тем обрывкам информации, что вы выдаете, это будет сложно, к сожалению

ph1lm
Я с удовольствием в этом разберусь, но по тем обры...

Ну у вас партиции по одному полю а фильтруете вы по другому, кх не знает что и там и там одно и тоже https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/ https://stackoverflow.com/questions/60142967/how-to-understand-part-and-partition-of-clickhouse?r=SearchResults&s=3%7C56.7987 Т.е.по уму надо оставить одно поле и использовать его и не хранить лишнее, если это невозможно, то можно хакнуть, партиционировать по обеим полям, т.о. чтобы партиция получалась одна, потому что в колонках одна и та же дата.

ph1lm- Автор вопроса

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

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

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта