Материализованные представления: как они могут обернуться обоюдоострым мечом
Это руководство — часть серии материалов, подготовленных по результатам митапов сообщества. Для получения дополнительных практических решений и рекомендаций вы можете просматривать материалы по конкретным проблемам. Слишком много частей тормозят вашу базу данных? Ознакомьтесь с руководством сообщества Too Many Parts. Узнайте больше о материализованных представлениях.
Антипаттерн хранения с 10-кратным ростом
Реальная проблема в продакшене: «У нас было материализованное представление. Таблица сырых логов занимала около 20 ГБ, но представление для этой таблицы разрослось до 190 ГБ, то есть почти в 10 раз больше исходной таблицы. Это произошло потому, что мы создавали по одной строке на каждый атрибут, а в каждом логе может быть до 10 атрибутов.»
Правило: Если ваш GROUP BY создаёт больше строк, чем сокращает, вы строите дорогой индекс, а не материализованное представление.
Проверка состояния материализованного представления в продакшене
Этот запрос помогает предсказать, будет ли материализованное представление сжимать данные или раздувать их объём до того, как вы его создадите. Запустите его для вашей реальной таблицы и столбцов, чтобы избежать сценария «разрастания до 190 ГБ».
Что он показывает:
- Низкий коэффициент агрегации (<10%) = хорошее материализованное представление, значительное сжатие
- Высокий коэффициент агрегации (>70%) = плохое материализованное представление, риск взрывного роста объёма хранения
- Множитель хранения = во сколько раз больше/меньше будет занимать место ваше материализованное представление
Когда материализованные представления становятся проблемой
Предупреждающие признаки, за которыми стоит следить:
- Увеличивается задержка вставки (запросы, которые занимали 10 мс, теперь занимают 100 мс и более)
- Ошибки «Too many parts» появляются все чаще
- Всплески использования CPU во время операций вставки
- Тайм-ауты вставки, которых раньше не было
Вы можете сравнить производительность вставки до и после добавления материализованных представлений с помощью system.query_log, отслеживая тенденции по длительности выполнения запросов.
Источники видео
- ClickHouse at CommonRoom - Kirill Sapchuk — источник кейса о «чрезмерном энтузиазме вокруг материализованных представлений» и «раздувании объёма данных с 20 GB до 190 GB»