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

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

34 ответов

11 просмотров

помогает просто 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】
Вам надо оптимизировать последний запрос не ломая ...

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
падает джоба хотя уже была собрана на соседнем namespace, куда капать? │ │ Copying blob sha256:2fa066caddb8f09a71082b03aa43046f79346a01d9c89e06a1f508bb1207dba5 427 │ │ Copyin...
Andrei St
6
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
6
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
7
Здравствуйте. Задача состоит в том, чтобы сделать real-time чат в мобильном приложении. После передачи сообщения пользователем через веб-сокеты, для основного и долговременног...
🐾
5
Всем привет! А в werf есть возможность скипать проверку сертификата кластера? Я пытаюсь сделать werf converge из GitHub actions, но кластер на локалке с docker-desktop выходит...
Roman Ermakov
2
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Карта сайта