Real-time аналитикаХранилище данныхCloud
Предварительные требования
- A running ClickHouse Cloud service. If you don’t have one yet, complete the ClickHouse Cloud quick start first.
uk_price_paid и представленные в них концепции:
Что вы создадите
uk_price_paid по town или county требуется полное сканирование таблицы, поскольку таблица отсортирована по (postcode, addr1, addr2).
В этом кратком руководстве вы решите эту проблему, создав проекцию — дополнительное отсортированное представление данных, хранящееся внутри той же таблицы. В отличие от materialized views, проекции не требуют отдельной целевой таблицы, остаются синхронизированными с мутациями (удалениями и обновлениями) и прозрачно используются оптимизатором запросов — вы по-прежнему выполняете запросы к таблице с тем же именем.
К концу этого руководства вы поймёте, как добавить и материализовать проекцию, как ClickHouse автоматически её выбирает и в каких случаях проекции предпочтительнее materialized views.
Зачем нужна проекция
Ваша таблица
uk_price_paid отсортирована по (postcode, addr1, addr2). Это значит, что ClickHouse может пропускать большие блоки данных, когда вы фильтруете по postcode, addr1 или addr2, но при фильтрации по town запросам приходится сканировать каждую строку — все 30 миллионов.Проекция хранит дополнительную отсортированную копию (некоторых или всех) столбцов внутри той же таблицы. Когда вы обращаетесь к таблице с запросом, оптимизатор запросов автоматически проверяет, позволит ли чтение из проекции прочитать меньше гранул, чем чтение из основных данных, и при необходимости прозрачно использует её.Ключевые отличия от materialized views:- Нет отдельной таблицы — проекция находится прямо внутри
uk_price_paid - Прозрачная оптимизация запросов — вы обращаетесь к
uk_price_paidкак обычно; ClickHouse автоматически выбирает проекцию - Синхронизируется с мутациями — удаления и обновления, применённые к таблице, отражаются в проекции
Добавьте проекцию в таблицу
Определите проекцию для Это регистрирует проекцию в метаданных таблицы, но не материализует её для существующих данных — только будущие вставки будут её заполнять.Убедитесь, что проекция присутствует в определении таблицы:В выводе должен быть блок
uk_price_paid, в которой town, date, price и type хранятся с сортировкой по (town, date):PROJECTION uk_price_paid_by_town.Материализуйте проекцию для существующих данных
Как и materialized view, недавно добавленная проекция применяется только к будущим вставкам. Чтобы заполнить её 30 миллионами строк, уже находящимися в таблице, нужно материализовать её явно:Эта операция выполняется как фоновая мутация. Вы можете проверить её прогресс:Когда
is_done = 1, проекция полностью материализована. Также можно убедиться в этом, проверив system.projection_parts:Выполните запрос к таблице и обратите внимание на автоматическое использование проекции
Теперь выполните запрос с фильтром по Проверьте статистику запроса — считывается значительно меньше строк, чем до появления проекции, поскольку ClickHouse автоматически выбрал чтение из проекции Ищите в выводе Это принудительно запускает полное сканирование таблицы, чтобы вы могли увидеть разницу в количестве прочитанных строк.
town — к той же таблице, к которой вы обращались ранее:uk_price_paid_by_town вместо сканирования исходных данных.Убедиться, что проекция действительно использовалась, можно с помощью EXPLAIN:ReadFromMergeTree, где упоминается имя проекции. Если вы хотите явно сравнить производительность, можно отключить оптимизацию проекций для одного запроса:Сравнение проекций и materialized views
И проекции, и materialized views решают одну и ту же задачу — ускоряют чтение при альтернативных шаблонах доступа, — но предполагают разные компромиссы. Коротко говоря, проекции лучше подходят, когда нужен лишь другой порядок сортировки тех же данных; materialized views более гибки, когда требуется преобразовывать, агрегировать или направлять данные в другую схему. Подробное сравнение см. в разделе Materialized views versus projections.
Оцените дополнительный расход хранилища
Проекции хранят вторую копию выбранных столбцов в той же таблице, увеличивая использование диска. Выполните запрос к Вы также можете проверить хранилище для конкретных проекций:Это тот же базовый компромисс, что и у materialized view: больше места на диске в обмен на более быстрое чтение. Проекция может быть меньше полной копии, поскольку включает только четыре выбранных столбца, а степень сжатия зависит от порядка сортировки.
system.parts, чтобы увидеть общий размер uk_price_paid (который теперь включает данные проекций):Следующие шаги
uk_price_paid, которая хранит данные, отсортированные по (town, date), что позволяет выполнять быстрые выборки по городу без создания отдельной таблицы. Вы узнали, что проекции прозрачно выбираются оптимизатором запросов, остаются синхронизированными с мутациями и обеспечивают более высокую производительность чтения в обмен на дополнительное место на диске.
Далее ознакомьтесь со следующими Быстрыми стартами:
Или подробнее изучите справочную документацию:
