Поделиться через


Материализованные представления

Область применения: ✅Microsoft Fabric✅Azure Data Explorer

Материализованные представления предоставляют запрос агрегирования по исходной таблице или по другому материализованному представлению.

Материализованные представления всегда возвращают актуальный результат запроса агрегирования (всегда свежий). Запрос материализованного представления является более производительным, чем выполнение агрегирования непосредственно над исходной таблицей.

Примечание.

Зачем использовать материализованные представления?

Инвестируя ресурсы (хранилище данных, фоновые циклы ЦП) для материализованных представлений часто используемых агрегатов, вы получаете следующие преимущества:

  • Улучшение производительности: запросы материализованного представления обычно выполняются лучше, чем запрашивать исходную таблицу для одной и той же функции агрегирования.

  • Свежесть: материализованный запрос представления всегда возвращает самые актуальные результаты, независимо от того, когда материализация в последний раз произошла. Запрос объединяет материализованную часть представления с записями в исходной таблице, которые еще не материализованы ( delta часть), всегда предоставляя самые актуальные результаты.

  • Сокращение затрат. Запрос материализованного представления потребляет меньше ресурсов, чем агрегирование по исходной таблице. Политика хранения исходной таблицы может быть сокращена, если требуется только агрегирование. Эта настройка снижает затраты на горячий кэш для исходной таблицы.

Примеры вариантов использования см. в разделе "Материализованные варианты использования представления".

Как материализованные представления работают

Материализованное представление состоит из двух компонентов:

  • Материализованная часть — таблица с агрегированными записями из исходной таблицы, которая уже обработана. Эта таблица всегда содержит одну запись для комбинации агрегирования по группе.
  • Разностное значение — недавно принятые записи в исходной таблице, которая еще не обработана.

Запрос материализованного представления объединяет материализованную часть с разностной частью, предоставляя актуальный результат запроса агрегирования. Процесс автономной материализации получает новые записи из разностной таблицы в материализованную таблицу и обновляет существующие записи. Если пересечение между разностной и материализованной частью большое, и многие записи требуют обновления, это может негативно повлиять на процесс материализации. См . мониторинг материализованных представлений о том, как устранять такие ситуации.

Материализованные запросы представлений

Существует 2 способа запроса материализованного представления:

  • Запрос всего представления: при запросе материализованного представления по его имени, аналогично запросу к таблице материализованного представления объединяет материализованную часть представления с записями в исходной таблице, которые еще не материализованы (the delta).

    • Запросы материализованного представления всегда возвращают самые актуальные результаты на основе всех записей, полученные в исходную таблицу. Дополнительные сведения о материализованных и нематериализованных частях в материализованном представлении см. в статье о работе материализованных представлений.
    • Этот параметр может не выполняться лучше, так как он должен материализовать delta часть во время запроса. Производительность в этом случае зависит от возраста представления и фильтров, применяемых в запросе. В разделе оптимизатора запросов материализованного представления содержатся возможные способы повышения производительности запросов при запросе всего представления.
  • Запрашивать материализованную часть только: другой способ запроса представления — использовать функциюmaterialized_view(). Этот параметр поддерживает запрос только материализованную часть представления, указывая максимальную задержку, доступную пользователю.

    • Этот параметр не гарантирует возврат самых актуальных записей, но он всегда должен быть более производительным, чем запрашивать все представление.
    • Эта функция полезна для сценариев, в которых вы готовы пожертвовать свежестью для производительности, например для панелей мониторинга телеметрии.

Совет

Запросы по материализованной части всегда выполняются лучше, чем запросы ко всему представлению. Всегда используйте функцию materialized_view() , если применимо к вашему варианту использования.

  • Материализованные представления участвуют в запросах между кластерами или между базами данных, но не включаются в объединения подстановочных знаков или поиски.

    • Следующие примеры включают материализованные представления по имениViewName:
    cluster('cluster1').database('db').ViewName
    cluster('cluster1').database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    
    • Следующие примеры не включают записи из материализованных представлений:
    cluster('cluster1').database('db').*
    database('*').View*
    search in (*)
    search * 
    
  • Материализованные представления участвуют в межсайтовых или межбазовых запросах, но не включаются в объединения подстановочных знаков или поиски.

    • Следующие примеры включают материализованные представления по имениViewName:
    cluster("<serviceURL>").database('db').ViewName
    cluster("<serviceURL>").database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    
    • Следующие примеры не включают записи из материализованных представлений:
    cluster("<serviceURL>").database('db').*
    database('*').View*
    search in (*)
    search * 
    

Оптимизатор запросов материализованного представления

При запросе всего представления материализованная часть объединяется с delta временем запроса. Это включает агрегирование delta и присоединение его с материализованной частью.

  • Запрос всего представления лучше выполняется, если запрос включает фильтры в группе по ключам материализованного запроса представления. Дополнительные советы по созданию материализованного представления на основе шаблона запроса см. в .create materialized-view разделе советов по производительности.
  • Оптимизатор запросов выбирает сводные и присоединенные стратегии, которые, как ожидается, повышают производительность запросов. Например, решение о том, следует ли перемешивать запрос, зависит от количества записей в delta части. Следующие свойства запроса клиента обеспечивают некоторый контроль над примененными оптимизациями. Эти свойства можно протестировать с помощью материализованных запросов представления и оценить их влияние на производительность запросов.
Имя свойства запроса клиента Тип Описание
materialized_view_query_optimization_costbased_enabled bool Если задано значение false, отключает оптимизацию суммы и соединения в материализованных запросах представления. Использует стратегии по умолчанию. По умолчанию — true.
materialized_view_shuffle dynamic Принудительное перетасовка материализованного запроса представления и (необязательно) предоставляет определенные ключи для перетасовки. См . приведенные ниже примеры .

ingestion_time() функция в контексте материализованных представлений

функция ingestion_time() возвращает значения NULL при использовании в контексте материализованного представления при запросе всего представления. При запросе материализованной части представления возвращаемое значение зависит от типа материализованного представления:

  • В материализованных представлениях, включающих одну arg_max()/arg_min()take_any()/агрегирование, ingestion_time() значение равно ingestion_time() соответствующему записи в исходной таблице.
  • Во всех других материализованных представлениях значение ingestion_time() составляет приблизительно время материализации (см . способ работы материализованных представлений).

Примеры

  1. Запрос всего представления. В качестве последних записей в исходной таблице включены следующие записи:

    ViewName
    
  2. Запрашивайте материализованную часть представления только независимо от того, когда он был последним материализован.

    materialized_view("ViewName")
    
  3. Запросите все представление и укажите "подсказку" для использования shuffle стратегии. В качестве последних записей в исходной таблице включены следующие записи:

    • Пример #1: перетасовка на основе столбца Id (аналогично использованию hint.shufflekey=Id):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName", "Keys" : [ "Id" ] }]);
    ViewName
    
    • Пример #2: перетасовка на основе всех ключей (аналогично использованию hint.strategy=shuffle):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName" }]);
    ViewName
    

Замечания, связанные с быстродействием

Основными участниками, которые могут повлиять на работоспособности материализованного представления, являются:

  • Ресурсы кластера: как и любой другой процесс, выполняемый в кластере, материализованные представления используют ресурсы (ЦП, память) из кластера. Если кластер перегружен, добавление материализованных представлений в него может привести к снижению производительности кластера. Отслеживайте работоспособность кластера с помощью метрик работоспособности кластера. Оптимизированное автомасштабирование в настоящее время не учитывает работоспособность материализованных представлений в рамках правил автомасштабирования.
    • Процесс материализации ограничен объемом памяти и ЦП, который он может использовать. Эти ограничения определены и могут быть изменены в группе рабочих нагрузок материализованных представлений.
  • Перекрываются материализованными данными: во время материализации все новые записи, которые отправляются в исходную таблицу с момента последней материализации (разностной) обрабатываются и материализуются в представление. Чем выше пересечение между новыми записями и уже материализованными записями, тем хуже будет производительность материализованного представления. Материализованное представление лучше всего работает, если количество обновляемых записей (например, в arg_max представлении) является небольшим подмножеством исходной таблицы. Если все или большинство материализованных записей представления должны обновляться в каждом цикле материализации, то материализованное представление может не работать хорошо.

  • Скорость приема: нет жестко закодированных ограничений на объем данных или частоту приема данных в исходной таблице материализованного представления. Однако рекомендуемая скорость приема для материализованных представлений не превышает 1–2 ГБ/с. Более высокие показатели приема могут по-прежнему хорошо работать. Производительность зависит от размера базы данных, доступных ресурсов и количества пересечения с существующими данными.

  • Количество материализованных представлений в кластере: приведенные выше рекомендации применяются к каждому материализованному представлению, определенному в кластере. Каждое представление использует свои собственные ресурсы, и многие представления конкурируют друг с другом по доступным ресурсам. Хотя в кластере нет жестко закодированных ограничений на количество материализованных представлений, кластер может не обрабатывать все материализованные представления, если существует множество определенных. Политику емкости можно изменить, если в кластере существует более одного материализованного представления. Увеличьте значение ClusterMinimumConcurrentOperations в политике для параллельного выполнения более материализованных представлений.
  • Определение материализованного представления: определение материализованного представления должно быть определено в соответствии с рекомендациями по запросу для оптимальной производительности запросов. Дополнительные сведения см. в разделе "Создание советов по производительности команд".

Материализованное представление по материализованному представлению

Материализованное представление можно создать над другим материализованным представлением, если исходное материализованное представление представляет собой представление дедупликации. В частности, агрегирование исходного материализованного представления должно быть take_any(*) для дедупликации исходных записей. Второе материализованное представление может использовать любые поддерживаемые функции агрегирования. Дополнительные сведения о создании материализованного представления по материализованному представлению см .create materialized-view . в команде.

Совет

При запросе материализованного представления, определенного в другом материализованном представлении, рекомендуется запрашивать материализованную часть только с помощью materialized_view() функции. Запрос всего представления не выполняется, если оба представления не полностью материализованы. Дополнительные сведения см . в материализованных запросах представлений.