прошарен
Есть таблица Replacing MT с колонками hash(PK), v1, v2 (by default '')
Есть Join- таблица - otc_join
С этими значениями, соединяем по hash
Сначала заполняю v1:
ALTER TABLE transactions update v1 = joinGet('otc_join', 'v1', hash)
WHERE type = ''
а потом, второй:
ALTER TABLE transactions update v2 = joinGet('otc_join', 'v2', hash)
WHERE v1 = 'otc' and v2 = ''
И вот беда в том, что в целом оно работает, но постоянно процедура "застревает" и либо v1 блочится, либо v2
И следующий раз процедура не сработает вообще и приходится все время использовать
kill mutation where not is_done;
В чем может быть дело? Как я могу сделать код стабильным?
Всем неравнодушным большое спасибо!
а вы дожидаетесь конца предыдущей мутации?
Ммм, видимо нет Но ведь изменение двух разных колонок, разве должно одно блочить другое? Не совсем понимаю, как оно под капотом А если дело в этом, как мне это обойти? Дело в том, что этот код запускается в цикле через драйвер, неужели запускать sleep и проверку, что мутаций незаконченных нет?
а как часто вы запускаете? мутации не предполагают что вы их будете в своей бизнес логике распихвать по коду, а только разовые ручные запуски есть настйрока mutations_sync, которая позволяет дожидаться конца мутаций
Довольно часто, но интервалы где-то по 10 минут Дело в том, что у меня таблица ок 800млн записей И мне надо заполнить колонки прямо в ней, скажем type и change И если где-то это просто Alter table type … Where … То для некоторых записей там нужно бахнуть нехилый подзапрос: change, например, вообще не из этой таблицы достаю Так вот я сделал так Я иду в цикле, забирая из моей таблицы подряд 1млн записей, вычисляю для них change и type, кидаю полученные значения в join таблицу вместе с hash, по которому джоиню потом Ну и потом через эту временную таблицу пришиваю вычисленные значения и двигаюсь дальше А Как иначе это следует делать, и почему этот вариант плох, помимо вот этих зависающих мутаций?
ну это просто путь в никуда, вангую что вы наделали этих мутаций и они у вас зависают не из-за разных колонок, а потому что они не успевают за 10 минут пройти. Вы просто насилуете ваш сервер и всё, ничего хорошего не получится. Переделываете вашу схему чтобы не надо было обновлять данные, или обновление было максимум раз в сутки например
или ReplcacingMergeTree + SELECT .. FROM table FINAL
Можете, пожалуйста, чуть подробнее?)
Обсуждают сегодня