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

Привет, читал документацию, но все равно возникла не уверенность в

познаниях)
Подскажите пожалуйста в некоторых вопросах:
1. Primary Index, удобная штука для выборки, этот индекс может содержать несколько полей, на сколько будет хардкорно, если у меня будет 5-6 полей, вставка происходит с частотой 3000 записей в сек . Не возникнут ли у меня проблемы?
2. Партиционирование думаю сделать под дням, норма ли это? В основном выборка идет по суточно, реже за несколько суток, совсем редко за месяц.Не будет ли большой проблемой?
Можно ли партиционирование сделать к примеру по несколько дней, к примеру 7....
Спасибо!

14 ответов

9 просмотров

1. В целом длинный pk - это плохо: он будет помещаться в оперативку. 2. Партиционирование по дням делают, однако надо тестировать на данных, если вы поместите дату в начало pk, ch использует его на запросе. Также учитывайте, что партиционирование по дням это x30 файлов. По поводу партиционирования по некоторому количеству дней (например по 7) - да, можно. Нужно добавить в partition by не date, а toStartOfWeek или нечто подобное. Однако я не уверен, что без указания аналогичной функции в запросе не будут прочтены лишние данные.

L-dar- Автор вопроса
L-dar
Спасибо! Буду тестировать

ах да, самое важное вставка происходит с частотой 3000 записей в сек не надо лить в ch данные по 1 строке, заливайте батчами 3000 записей в секунду по 1 строке - ужас 1 запись в секунду по 3000 строк - легко

L-dar- Автор вопроса
Tagir Gumerov
ах да, самое важное вставка происходит с частотой ...

Ну да, читал об этом. Какой инструмент посоветуете, чтоб собирал эти батчи, перед вставкой?

L-dar
Ну да, читал об этом. Какой инструмент посоветуете...

мы используем kafka + заливка батчами по расписанию есть готовые инструменты, заточенные под ch: https://clickhouse.tech/docs/ru/interfaces/third-party/proxy/

вообще, надо понять что индексы в clickhouse это не B-Tree индексы как в остальных СУБД, когда мы методом половинного поиска по значению из индекса за o(log n) быстро находим где у нас в основном файле смещения по которому лежат данные с требуемым значением индекса в ClickHouse индексы это data skip индексы для PK это фактически min max индекс то есть мы читаем небольшой .mrk файл с кешированием в памяти .. видим в нем значения min \ max значения pk полей, для нескольких (по умолчанию 8192) строк в таблице и смещения в .bin файлах (начало compressed блока + смещение внутри uncompressed блока) и на этом основании принимаем решение как именно вычитывать этот .bin файл Партицирование по дням нужно только когда данных (размер .bin файлов) РЕАЛЬНО ОЧЕНЬ МНОГО... (размеры старых смерженых партов начинаются от нескольких сотен мегабайт) Партицирование это физическое разбиение на разные каталоги и оно позволяет очень быстро сразу определиться за какой период мы читаем, выборка из партиций идет паралельно, но для HDD много партиций в таком случае будет вредно, для SSD норм Партицирование по дням может мешать если вы всталяете данные в одном INSERT за большой промежуток времени и затрагиваете сразу несколько партиций, в которых будет создаваться куча мелких партов (system.parts) которые потом надо в бекграунде мержить с более старыми крупными партами > Вставка 3000 записей в секунду. в смысле 3000 INSERT по одной записи в секунду? НЕ ДЕЛАЙТЕ ТАК! или 3000 INSERT по 1 000 записей в секунду? так можно, лучше пусть будет 30 INSERT по 100 000 записей, или один INSERT в секунду на 3 000 000 записей

L-dar- Автор вопроса
Slach [altinity]
вообще, надо понять что индексы в clickhouse это н...

Спасибо за развернутый ответ и совет. Вопрос такой, стоит ли в индексе хранить UUID? Как он тогда вычислит min max? Или будет сортировать в алфавитном порядке?

L-dar
Спасибо за развернутый ответ и совет. Вопрос такой...

нет не стоит вообще в PK индексе не стоит хранить поля с высокой кардинальностью (больше сотен тысяч) значений UUID вообще вредная штука, потому что значение рандомное и монотонно не возрастает соответсвенно размазывается по всем партам и трудно парты отбрасывать потому что не ясно есть ваш UUID в них или нет лучше замените на snowflake id какой нибудь который возрастает монотонно он похож на время и его кстати уже можно в PK хранить

Slach [altinity]
вообще, надо понять что индексы в clickhouse это н...

Словари есть. Буду пробовать, спасибо. На что ориентироваться в результате?

L-dar- Автор вопроса
Slach [altinity]
нет не стоит вообще в PK индексе не стоит хранить ...

а что такое snowflake id? Гугл говорит только что snowflake база данных

L-dar
а что такое snowflake id? Гугл говорит только что ...

вот так гуглите =) snowflake да =) такая база есть twitter snowflakeid sonyflake id

L-dar
а что такое snowflake id? Гугл говорит только что ...

Ваш гугл вам врет https://medium.com/nuances-of-programming/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-snowflake-id-968dd6d21ca8

Сапарбаев Сурож
Словари есть. Буду пробовать, спасибо. На что орие...

ну вы смотрите какой именно запрос генерирует на удаленных нодах ваш distributed запрос может быть там не передается dictGet условие... и вы там пытаетесь как то не потоково буферизировать результат вообще конечно запрос и структуры таблиц словарей нужны ... по памяти не обязательно именно ваш запрос отваливается, может быть там что-то другое отжирает

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
Коллеги, доброе утро. Запустил на удаленном хосте приложение (ручками зашел туда по ssh и запустил, не командой удаленно). Создал потом ssh-туннель, и с моей машины приложение...
Δημήτηρ
9
Карта сайта