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

Ребят привет. При записи строки в кликхауз она попадает сразу

в нужную партицию, или это уже происходит в фоновом режиме? Хочется использовать do_not_merge_across_partitions_select_final для запросов с FINAL, но не понимаю будут ли дубли в том случае если записанная строка не сразу попадает в нужную партицию.

16 ответов

23 просмотра

строка может быть только в одной партиции, вставляется сразу в правильную партицию

Sergey- Автор вопроса
Konstantin Ilchenko
строка может быть только в одной партиции, вставля...

То есть при использовании ReplacingMergeTree и партицированием по дате можно все SELECT-запросы писать c FINAL + do_not_merge_across_partitions_select_final и быть уверенным, что в результате не будет две версии одной строки, верно?

Sergey
То есть при использовании ReplacingMergeTree и пар...

вы вручную вызываете optimize final на старых партициях?

Sergey- Автор вопроса
Konstantin Ilchenko
вы вручную вызываете optimize final на старых парт...

Вопрос в том надо ли его вызывать. То есть если новая версия строки записывается в ту же партицию (партицирование по дате и дата не изменилась), то выходит, что do_not_merge_across_partitions_select_final будет достаточен так как есть гарантия, что обе версии строки в одной партиции и optimize не нужен. Пытаюсь понять верно ли это.

Sergey
Вопрос в том надо ли его вызывать. То есть если но...

не верно, у вас в старой партиции могут быть дубли и пока вы не вызвали optimize final на старой партиции нет никаких гарантий что дублей нет https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-final-clause-speed/ So it can work in the following way: Daily partitioning After day end + some time interval during which you can get some updates - for example at 3am / 6am you do OPTIMIZE TABLE xxx PARTITION 'prev_day' FINAL In that case using that FINAL with do_not_merge_across_partitions_select_final will be cheap.

Sergey- Автор вопроса
Konstantin Ilchenko
не верно, у вас в старой партиции могут быть дубли...

Давайте еще раз: Я делаю таблицу: CREATE TABLE repl_tbl ( `id` UInt32, `name` String, `verion` UInt16, `dt` DateTime ) ENGINE = ReplacingMergeTree(version) PARTITION BY toMonday(dt) ORDER BY id; Так как PARTITION BY toMonday(dt) это дает мне гарантию, что новая версия строки если НЕ изменить dt будет записана в ту же партицию, где находится предыдущая версия строки. Следовательно если я делаю запрос с do_not_merge_across_partitions_select_final: SELECT * FROM test FINAL SETTINGS do_not_merge_across_partitions_select_final = 1; То у мене исключается вероятность дублей так как дубли могут быть только в рамках ОДНОЙ партиции (потому что dt не меняется). Следовательно OPTIMIZE не требуется. Где я ошибся?

Sergey
Давайте еще раз: Я делаю таблицу: CREATE TABLE r...

Если гарантируется, что запись с одним и тем же id будет иметь один и тот же dt, то вы не ошиблись нигде. А если записи с одним и тем же id могут лечь в разные партиции, то именно здесь и ошиблись.

Sergey
Давайте еще раз: Я делаю таблицу: CREATE TABLE r...

да, дублей не будет, просто эта настройка do_not_merge_across_partitions_select_final не до конца раскроет потенциал по скорости)

В фоновом режиме

Sergey- Автор вопроса
Константин
В фоновом режиме

То есть меня обманули?) все таки OPTIMIZE обязателен перед запросом, чтобы дублей точно не было?

Sergey
То есть меня обманули?) все таки OPTIMIZE обязател...

optimize не гарантирует, что дублей точно не будет )

Sergey
То есть меня обманули?) все таки OPTIMIZE обязател...

Я не знаю, что вам наговорили. Но при вставке создаётся отдельный кусок данных, а потом он сливается в более большой кусок данных и т.д.

ivan
optimize не гарантирует, что дублей точно не будет...

FINAL OPTIMTIZE DEDUPLICATED гарантирует что удалит все дубли

Sergey- Автор вопроса
Sergey
Давайте еще раз: Я делаю таблицу: CREATE TABLE r...

Вот я подробно расписал что я пытаюсь понять. Кусок это кусок, я про партицию узнаю

Константин
FINAL OPTIMTIZE DEDUPLICATED гарантирует что удали...

как такое можно гарантировать в системе без блокировок чтений / вставок? пока Clickhouse мерджит строки в выбранных на начало запроса партах, спокойно может прилететь новый парт с дубликатом

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
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...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
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
Карта сайта