Real-time аналитикаХранилище данныхОбсервабилитиAI/MLCloudOss
Предварительные требования
- A running ClickHouse Cloud service. If you don’t have one yet, complete the Create your first Cloud service quickstart first.
uk_price_paid, созданную в нем.
Что вы создадите
uk_price_paid по town или county требуют полного сканирования таблицы, поскольку она отсортирована по (postcode, addr1, addr2).
В этом руководстве по быстрому старту вы решите эту проблему, создав materialized view, которое хранит те же данные, но в сортировке по (town, date), что позволяет быстро выполнять поиск по городу без изменения исходной таблицы.
В итоге вы поймёте, как materialized view работают как триггеры вставки, как выполнять дозагрузку существующих данных и каков компромисс по дисковому пространству при хранении данных в двух экземплярах.
Зачем нужна materialized view
Ваша таблицаuk_price_paid отсортирована по (postcode, addr1, addr2). Это означает, что ClickHouse может пропускать большие блоки данных, когда вы фильтруете по postcode, addr1 или addr2, но запросы с фильтрацией по town должны сканировать каждую строку — все 30 миллионов.Можно было бы создать вторую таблицу с другим ORDER BY, но тогда вам пришлось бы не забывать выполнять вставку в обе таблицы каждый раз, когда поступают новые данные. Materialized view автоматизирует этот процесс: она отслеживает вставки в исходную таблицу, преобразует строки и автоматически записывает их в целевую таблицу.Думайте о materialized view как об insert trigger: каждый раз, когда в исходную таблицу вставляются строки, запрос SELECT этой MV выполняется для нового блока строк, а результат вставляется в целевую таблицу.Создайте целевую таблицу
Для materialized view нужно место для сохранения результата. Это обычная таблица MergeTree — вы полностью управляете её схемой,ORDER BY и PARTITION BY.Создайте таблицу с сортировкой по (town, date) и только с теми столбцами, которые нужны для запросов по городам:Создайте materialized view
Теперь создайте materialized view, которая связывает исходную таблицу (uk_price_paid) с целевой таблицей (uk_price_paid_by_town):TO uk_price_paid_by_town указывает ClickHouse записывать результат SELECT в целевую таблицу. Теперь при каждой вставке строк в uk_price_paid это MV срабатывает и вставляет преобразованные строки в uk_price_paid_by_town.Но есть важный нюанс: materialized views срабатывают только при вставках. Если вы удаляете или обновляете строки в исходной таблице, целевая таблица об этом не узнает — MVs не синхронизируются с удалениями и обновлениями. Если вам нужна такая синхронизация, рассмотрите возможность использовать проекции.Дозагрузка существующих данных
materialized view обрабатывает только будущие вставки. 30 миллионов строк вuk_price_paid были вставлены до создания MV, поэтому целевая таблица сейчас пуста.Выполните дозагрузку вручную:Выполните запрос к целевой таблице materialized view
Теперь выполните запрос с фильтрацией поtown для целевой таблицы и сравните его с запросом непосредственно к исходной таблице.Сначала выполните запрос к исходной таблице:town отсутствует в ORDER BY исходной таблицы.Теперь выполните тот же запрос к целевой таблице materialized view:(town, date), и ClickHouse может пропустить все данные, не соответствующие LONDON.Выполните SHOW TABLES, чтобы увидеть, что было создано:uk_price_paid_by_town (целевую таблицу), и uk_price_paid_by_town_mv (представление). Поскольку вы использовали CREATE MATERIALIZED VIEW ... TO, вы сами задаёте имя целевой таблицы. Если опустить предложение TO, ClickHouse создаст целевую таблицу с неявным именем (.inner.xxx), с которой сложнее работать напрямую.
Поэтому materialized view рекомендуется создавать с предложением TO.Обратите внимание: данные хранятся в двух местах
Materialized views обеспечивают более быстрое чтение за счёт дополнительного места на диске. Выполните запрос кsystem.parts, чтобы увидеть, сколько места занимает каждая таблица:uk_price_paid с сортировкой по (postcode, addr1, addr2) и один раз в uk_price_paid_by_town с сортировкой по (town, date). В этом и заключается основной компромисс: вы расходуете больше места на диске в обмен на более быстрое чтение для разных сценариев доступа.Целевая таблица может занимать меньше места на диске, потому что содержит меньше столбцов, а порядок сортировки (town, date) может сжиматься иначе, чем в исходной таблице.