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

Https://Github.Com/ClickHouse/ClickHouse/Issues/40583 Кто-Нибудь может подсказать куда копать?

34 ответов

19 просмотров

помогает просто unix timestamp вместо time юзать, даже минус не нужен 0.2 сек vs 11 сек CREATE TABLE logs_time_dt ( `time` DateTime64(9), `project` LowCardinality(String) CODEC(ZSTD(7)), `service` LowCardinality(String) CODEC(ZSTD(7)), `message` String CODEC(ZSTD(7)), `tags_hash` Array(UInt64) ) ENGINE = MergeTree PARTITION BY toDate(time) ORDER BY (project, service, toUnixTimestamp64Nano(time))

ORDER BY project DESC, service DESC, time DESC

Denny [Altinity]
ORDER BY project DESC, service DESC, time DESC

а эта штука тут не работает? Support optimize_read_in_order if prefix of sorting key is already sorted. E.g. if we have sorting key ORDER BY (a, b) in table and query with WHERE a = const ORDER BY b clauses, now it will be applied reading in order of sorting key instead of full sort. #32748 (Anton Popov).

Denny [Altinity]
ORDER BY project DESC, service DESC, time DESC

При таком explain plan actions=1 … меняется с ReadType: InReverseOrder на ReadType: Default

Konstantin Ilchenko
помогает просто unix timestamp вместо time юзать, ...

как и в случае с советом вот этим где предлагается поменять ключ сортировки

Alex Salt
как и в случае с советом вот этим где предлагается...

это из-за LowCardinality, т.е. by design, слона я не заметил

Vitaly- Автор вопроса
Alex Salt
как и в случае с советом вот этим где предлагается...

Слишком много мелких чтений генерирует, даже если взять начальную схему и сделать селект с optimize_read_in_order = 0 всё драматически меняется) Было Merge sorted 20001 blocks, 20000 rows in 15.54792904 sec. Стало с SETTINGS optimize_read_in_order = 0 Merge sorted 13 blocks, 20000 rows in 0.203999065 sec

Denny [Altinity]
это из-за LowCardinality, т.е. by design, слона я ...

у меня примерно те же результаты если в project и service убрать LowCardinality. В твоём примере с гитхаба в запросе стоит limit

Konstantin Ilchenko
Слишком много мелких чтений генерирует, даже если ...

ага, но казалось бы оптимизатору лучше знать? Я разверну немного контекст, видимо это тоже нужно, это не единственный запрос который гоняется к таблице, поэтому workaround в стиле “а вот здесь оно сломается, поэтому делаем по-другому” делать сложно на более стандартном для логов кейсе вида: where message like ‘%foo%’ order by time desc limit 10000 запросы работают как надо, а если сортировку поменять или убрать optimize_read_in_order, то не как надо Не хочется здесь выбирать среди двух стульев

Alex Salt
ага, но казалось бы оптимизатору лучше знать? Я р...

я всегда думал что оптимизатора(CBO) нет в КХ, он просто по колонкам из запроса пытается понять можно ли применить оптимизацию или нет, но статистики нет. И это не всегда работает) Возможно разработчики вам что-то смогут подсказать К таблице у меня только вопрос зачем granularity 1024? вам часто нужны выборки по 1 строке? Не замедляют ли запросы skipping index с granularity 1 + маленький granularity у таблицы.

Vitaly- Автор вопроса
Konstantin Ilchenko
а эта штука тут не работает? Support optimize_rea...

сделал песочницу со всеми видами запросов. SET optimize_read_in_order = 0; https://fiddle.clickhouse.com/ba6e3a90-c41c-4680-ab77-06614f49cd6b SET optimize_read_in_order = 1; https://fiddle.clickhouse.com/dc407df3-099e-4515-beb5-832f619c75e7

Vitaly- Автор вопроса
Vitaly- Автор вопроса
Konstantin Ilchenko
я всегда думал что оптимизатора(CBO) нет в КХ, он ...

https://fiddle.clickhouse.com/2be9767a-40ea-40ee-b85a-6288b2a24669 сделал гранулярность 3 - еще хуже

Konstantin Ilchenko
я всегда думал что оптимизатора(CBO) нет в КХ, он ...

Гранулярность для таблицы скорее из идеи что “меньше данных читать за точечными запросами наверное лучше”. Какого-то исследования перфоманса на продакшен-данных не проводили, так что тут не скажу. Замерить при каких значениях будет лучше или хуже кажется непросто Про гранулярность data skipping index - он в количестве гранул измеряется, а не в количестве строчек. У нас результат запроса это обычно сотни или тысячи строчек. Хотя в каких-то случаях с точечным поиском чего-то очень конкретного могут быть и меньше. Про замеры опять же тут только смотрели какие-то выборочные запросы, что да, по логам оно какие-то гранулы очень неплохо скипает для определённых запросов.

Alex Salt
ага, но казалось бы оптимизатору лучше знать? Я р...

это норма для кластерного индекса, ниче не поделать, сортируйте по полям по которым фильтр есть всегда и с низким selectivity

【D】【J】
это норма для кластерного индекса, ниче не поделат...

у нас скорее кейс “хотим фильтровать по всему подряд”. Где-то как раз data skipping indexes с этим помогают

Alex Salt
у нас скорее кейс “хотим фильтровать по всему подр...

да, но тогда я б все равно сортировал по полю с максимальной кардинальностью сначала... порядок очень сильно влияет

【D】【J】
да, но тогда я б все равно сортировал по полю с ма...

Так там 3 поля, сортировка по time, остальные 2 константные, а в PREWHERE нужные поля вроде как сами попадают неплохо

Vitaly
screenshot https://fiddle.clickhouse.com/2be9767a-40ea-40ee-b...

тут главное понимать распределение данных, у вас синтетический пример в котором tags_hash это просто по порядку идут значения от 0 до 3000, и получается с гранулярностью 1024 вы довольно просто можете отфильтровать гранулу, если сделать в инсерте [ number % 8196 ] всё ещё быстрее станет. Вы уверены что у вас в реальности в проде такие упорядоченные данные?) Самое главное в skipping индексах изучить распределение по гранулам)

Vitaly- Автор вопроса
Konstantin Ilchenko
тут главное понимать распределение данных, у вас с...

да, грубо говоря у нас льются мегабайты логов в секунду. отсортированные по timestamp и в аттрибутах есть айди операции, операций параллельных - тысячи, если не больше

Alex Salt
Так там 3 поля, сортировка по time, остальные 2 ко...

зачем вам константные поля в индексе? встроенный prewhere optimization - плох на любом запросе сложнее чем 2+2

【D】【J】
зачем вам константные поля в индексе? встроенный p...

они в запросе константные, префикс ключа всегда там присутствует. Если речь о том чтобы поменять ordering key таблицы, я не уверен что так станет лучше про prewhere хочется примеры, на примере выше оно не особо на что-то влияет, с такими случаями не сталкивался, так что тут ничего внятного сказать не смогу

Vitaly
да, грубо говоря у нас льются мегабайты логов в се...

ну тоесть в tags_hash уникальных значений единицы и они редко повторяются?

Vitaly- Автор вопроса
Konstantin Ilchenko
ну тоесть в tags_hash уникальных значений единицы ...

сложность в том, что это логи сервисов. сегодня одно может быть, завтра другое)

Vitaly
сложность в том, что это логи сервисов. сегодня од...

я понимаю, я к тому что синтетический тест не показатель, вот вам супер быстрый запрос, потому что значения реже повторяются и большие гранулы. Прикиньте хотябы минимально распределение чтобы подобрать оптимально и не замедлить https://fiddle.clickhouse.com/21bfe473-2b4a-419c-8c83-caf7e05ce046

Vitaly
см

Вам надо оптимизировать последний запрос не ломая остальных?

Vitaly- Автор вопроса
【D】【J】
Вам надо оптимизировать последний запрос не ломая ...

нужно что бы два запроса работали приемлимо. один "простой" с лимитом и фильтром по мессадж и сложный с хешом

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
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
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
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
Карта сайта