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 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:Выполните запрос к таблице и обратите внимание на автоматическое использование проекции
Теперь выполните запрос с фильтром поtown — к той же таблице, к которой вы обращались ранее:uk_price_paid_by_town вместо сканирования исходных данных.Убедиться, что проекция действительно использовалась, можно с помощью EXPLAIN:ReadFromMergeTree, где упоминается имя проекции. Если вы хотите явно сравнить производительность, можно отключить оптимизацию проекций для одного запроса:Сравнение проекций и materialized views
И проекции, и materialized views решают одну и ту же задачу — ускоряют чтение при альтернативных шаблонах доступа, — но предполагают разные компромиссы. Коротко говоря, проекции лучше подходят, когда нужен лишь другой порядок сортировки тех же данных; materialized views более гибки, когда требуется преобразовывать, агрегировать или направлять данные в другую схему. Подробное сравнение см. в разделе Materialized views versus projections.Оцените дополнительный расход хранилища
Проекции хранят вторую копию выбранных столбцов в той же таблице, увеличивая использование диска. Выполните запрос кsystem.parts, чтобы увидеть общий размер uk_price_paid (который теперь включает данные проекций):Следующие шаги
В этом руководстве по быстрому старту вы добавили проекцию вuk_price_paid, которая хранит данные, отсортированные по (town, date), что позволяет выполнять быстрые выборки по городу без создания отдельной таблицы. Вы узнали, что проекции прозрачно выбираются оптимизатором запросов, остаются синхронизированными с мутациями и обеспечивают более высокую производительность чтения в обмен на дополнительное место на диске.
Далее ознакомьтесь со следующими руководствами по быстрому старту:
Или подробнее изучите справочную документацию:
