таблица:
engine = AggregatingMergeTree PARTITION BY month
ORDER BY (objectHash, month)
Прежде чем запускать мутацию сделал optimise final и дождался завершения (то есть количество партиций и партов стало равным).
Запустил мутацию, которая бежит по всей патриции без учета ключа, и она потребляет слишком много памяти (отвалились в это время остальные запросы по totalMemoryLimit, и на графиках после запуска видно было как растет потребление памяти). Хочу разбить эту мутацию на несколько. Для этого хочу изменить таблицу на
engine = AggregatingMergeTree PARTITION BY month
ORDER BY (objectHash%10, objectHash, month)
И запускать последовательно несколько мутаций с Where objectHash%10 = i. Но даст ли это результат? Кажется, что при выполнении мутацию, будет всё равно использована целиком вся партиция, и тогда не получу никакой пользы. Я правильно понимаю, что мне нужно также изменить ключ партиционирования чтобы это заработало?
покажите что за мутация, сколько памяти, мутации не должны использовать много памяти.
Большое спасибо за комментарий. Нашел что там в мутации делается подзапрос который вычитывает всю партицию, и видимо из-за него всё отваливалось по памяти. Я правильно понимаю, что в целом мутация должна последовательно читать отдельные блоки, а не считывать всю партицию целиком, как я предположил до этого?
да, мутация последовательно обрабатывает по 8 тыс. строк из парта, несколько партов могут процессится одновременно (это настраивается). Обычно мутации используют мало памяти. Если запустить подряд много мутаций они начинают объединятся в одну, с очень-очень длинным выражением, и парсер выражения начинает жрать память (я видел 50 тыс. мутаций объединились и там сотни мегабайт выражение было, падал сервер по ООМ со 100ГБ ОЗУ), в современных КХ это починили
Обсуждают сегодня