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

15 просмотров

он не сканит все гранулы, он взял 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- Автор вопроса

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта