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

Всем привет! Подскажите пожалуйста, насколько удаление партиции синхронная операция? Задача сделать etl

идемпотентным. Думаю делать это с помощью:
- alter table drop partition tuple(20230701)
- insert into select where day = '2023-07-01'

Насколько безопасно и правильно, делать именно так?

Потому что раньше я делал alter table delete и натыкался на дубли, и все остальное.
т.е. на момент выполнения insert'а, предыдущие строки уже будут гарантированно помечены/удалены, и не появятся в качестве дублей, если я в insert'е вставлю ровно их же?
Смутило, что в доке написано, что процесс дропа партиции занимает 10 минут

Может, нужно сначала сделать detach партиции, а потом ее удалить? Но как это будет дружить с тем, что инсертом будет создана новая партиция с таким же имененм?

Спасибо!

10 ответов

26 просмотров

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

Данные будут недоступны сразу, диск почистится через 10 минут. Мы примерно так и делаем, только вставка во временную таблицу и если инсерт отработал делаем attach или replace partition в зависимости от логики. Если вставка в distributed или replicated то могут быть дополнительные ньюансы

Vitalik- Автор вопроса
Konstantin Ilchenko
Данные будут недоступны сразу, диск почистится чер...

блин. вставляю в дистрибьютед, а под ним репликейтед мердж три 🥲

Vitalik- Автор вопроса
Konstantin Ilchenko
Данные будут недоступны сразу, диск почистится чер...

Если не трудно, можешь пожалуйста подсказать, можно ли обойти эти нюансы? Например, так, как я описал в своем сообщении выше, или мб по-другому? Потому что: - 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

Vitalik
Если не трудно, можешь пожалуйста подсказать, можн...

Примерный флоу в наших 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

Vitalik- Автор вопроса

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

Vitalik- Автор вопроса
Konstantin Ilchenko
и так и так бывает, зависит от шардироавния, если ...

Угу, понял. Получается, если например, у меня три шарда: 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

Vitalik
Угу, понял. Получается, если например, у меня три...

если через distributed вставлять да только надо будет создавать две таблицы соответственно tmp - Distributed tmp_local - ReplicatedMergeTree

Vitalik- Автор вопроса

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта