идемпотентным. Думаю делать это с помощью:
- alter table drop partition tuple(20230701)
- insert into select where day = '2023-07-01'
Насколько безопасно и правильно, делать именно так?
Потому что раньше я делал alter table delete и натыкался на дубли, и все остальное.
т.е. на момент выполнения insert'а, предыдущие строки уже будут гарантированно помечены/удалены, и не появятся в качестве дублей, если я в insert'е вставлю ровно их же?
Смутило, что в доке написано, что процесс дропа партиции занимает 10 минут
Может, нужно сначала сделать detach партиции, а потом ее удалить? Но как это будет дружить с тем, что инсертом будет создана новая партиция с таким же имененм?
Спасибо!
Вы можете вставлять в тмп таблицу, и после удачной вставке уже переносить в основную таблицу партицию
Данные будут недоступны сразу, диск почистится через 10 минут. Мы примерно так и делаем, только вставка во временную таблицу и если инсерт отработал делаем attach или replace partition в зависимости от логики. Если вставка в distributed или replicated то могут быть дополнительные ньюансы
блин. вставляю в дистрибьютед, а под ним репликейтед мердж три 🥲
Если не трудно, можешь пожалуйста подсказать, можно ли обойти эти нюансы? Например, так, как я описал в своем сообщении выше, или мб по-другому? Потому что: - insert into temp_table - detach from main_table & attach from temp_table / replace partition in main_table from temp_table выглядит гораздо лучше и надежнее, чем: - drop partition - insert into main_table
Примерный флоу в наших etl/dbt, позволяет перезапускать идемпотентно с любого места - настраиваем insert_distributed_sync = 1 - create table if not exists tmp AS main - truncate table tmp on cluster '' - insert into tmp - system sync replica on cluster 'cluster' tmp - раньше в этом месте ещё вставляли sleep(30) для надёжности, сейчас вроде и без этого ок - alter table main replace partition 'partition' on cluster 'cluster' from tmp если мы с нуля данные генерим за день например или attach partition если надо дописать новые данные - drop table tmp on cluster
Спасибо, а при этом tmp дистрибьютед?
и так и так бывает, зависит от шардироавния, если есть фиксированный ключ то делаем на шардах всё есть ещё настройка parallel_distributed_insert_select которая позволяет делать запросы к distributed, но процессинг будет на шардах, чтобы быстрее всё работало
Угу, понял. Получается, если например, у меня три шарда: x, y, z Сейчас там в main данные: x: 1, 4 y: 2, 5 z: 3, 6 И если я сделаю tmp as main (main при этом дистрибьютед) То при вставке в tmp, функция распределит данные по шардам точно так же, как если бы я вставлял сразу в main? т.е. insert into tmp распределит данные: x: 7 y: 8 z: 9 и уже можно будет без опасений аттачить эту партицию к main
если через distributed вставлять да только надо будет создавать две таблицы соответственно tmp - Distributed tmp_local - ReplicatedMergeTree
Ага, все, я понял, спасибо большое!
Обсуждают сегодня