в нужную партицию, или это уже происходит в фоновом режиме? Хочется использовать do_not_merge_across_partitions_select_final для запросов с FINAL, но не понимаю будут ли дубли в том случае если записанная строка не сразу попадает в нужную партицию.
строка может быть только в одной партиции, вставляется сразу в правильную партицию
То есть при использовании ReplacingMergeTree и партицированием по дате можно все SELECT-запросы писать c FINAL + do_not_merge_across_partitions_select_final и быть уверенным, что в результате не будет две версии одной строки, верно?
вы вручную вызываете optimize final на старых партициях?
Вопрос в том надо ли его вызывать. То есть если новая версия строки записывается в ту же партицию (партицирование по дате и дата не изменилась), то выходит, что do_not_merge_across_partitions_select_final будет достаточен так как есть гарантия, что обе версии строки в одной партиции и optimize не нужен. Пытаюсь понять верно ли это.
не верно, у вас в старой партиции могут быть дубли и пока вы не вызвали 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.
Давайте еще раз: Я делаю таблицу: 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 не требуется. Где я ошибся?
Если гарантируется, что запись с одним и тем же id будет иметь один и тот же dt, то вы не ошиблись нигде. А если записи с одним и тем же id могут лечь в разные партиции, то именно здесь и ошиблись.
да, дублей не будет, просто эта настройка do_not_merge_across_partitions_select_final не до конца раскроет потенциал по скорости)
Понял, благодарю всех!)
В фоновом режиме
То есть меня обманули?) все таки OPTIMIZE обязателен перед запросом, чтобы дублей точно не было?
optimize не гарантирует, что дублей точно не будет )
Я не знаю, что вам наговорили. Но при вставке создаётся отдельный кусок данных, а потом он сливается в более большой кусок данных и т.д.
FINAL OPTIMTIZE DEDUPLICATED гарантирует что удалит все дубли
Вот я подробно расписал что я пытаюсь понять. Кусок это кусок, я про партицию узнаю
как такое можно гарантировать в системе без блокировок чтений / вставок? пока Clickhouse мерджит строки в выбранных на начало запроса партах, спокойно может прилететь новый парт с дубликатом
Обсуждают сегодня