Выберите тип материализации для представлений метрик

На этой странице описывается выбор между агрегированными и нерегрегированными материализациями для представлений метрик на основе шаблонов запросов. Сведения о том, что такое каждый тип и как он работает, см. в разделе "Типы материализации" для представлений метрик.

Используйте следующую таблицу, чтобы найти правильный подход для вашей ситуации. В следующих разделах подробно дан ответ на каждый вопрос.

Ваша ситуация Approach
Вы часто выполняете одни и те же запросы и знаете, по каким измерениям выполняется группировка. Агрегированная материализация
Вы запрашиваете неаддитивную меру, например COUNT(DISTINCT), на фиксированном уровне детализации. Агрегированная материализация с измерениями, соответствующими запросам GROUP BY
Вы выполняете произвольные запросы к объединённым или отфильтрованным данным и не можете предсказать GROUP BY. Нерегрегированная материализация
У вас есть прогнозируемые панели мониторинга и нерегламентированные запросы в одном представлении метрик. Оба типа вместе
Представление метрик указывает на одну таблицу без соединений или фильтров. Ни то ни другое; используйте агрегированные материализованные представления для известных шаблонов или пропустите материализацию

Агрегированные материализации

Агрегированная материализация — это предварительно созданная таблица ответов для определенного типа вопроса. Он обслуживает соответствующие запросы быстрее, возвращая предварительно вычисляемые результаты вместо сканирования исходных данных.

В следующих примерах используется представление показателей данных о продажах с полями region, category и order_date, а также с мерами total_revenue (SUM), order_count (COUNT) и unique_customers (COUNT(DISTINCT)).

Как ускорить выполнение запроса, который я часто запускаю?

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

SELECT region, MEASURE(total_revenue) FROM sales_mv GROUP BY ALL

Если вы обычно запрашиваете region и order_date вместе, включите оба поля в одну материализацию:

- name: revenue_by_region_date
  type: aggregated
  dimensions:
    - region
    - order_date
  measures:
    - total_revenue
    - order_count

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

Как узнать, покрывает ли существующая материализация новый запрос?

Сравните измерения запроса GROUP BY с измерениями материализации. Если материализация не включает измерение, по которому выполняется группировка, запрос не сможет её использовать. Например, предположим, что вам нужна выручка с разбивкой по category, но единственная доступная материализация — это пример revenue_by_region_date, показанный ранее. Поскольку он не включает category, запросы с группировкой по category используют неагрегированную материализацию (если она существует) или исходные таблицы.

Если вы часто выполняете запросы по category, создайте для этого отдельную материализацию. Если запрос выполняется нечасто или уже достаточно быстро, не создавайте его. Каждая материализация добавляет затраты на хранение и обновление.

Как ускорить запрос с помощью недитивной меры?

Создайте агрегированную материализацию, измерения которой соответствуют точно запросу GROUP BY . Неаддитивные меры, такие как COUNT(DISTINCT), не могут агрегироваться на основе материализации с более мелким уровнем детализации, поэтому материализация с другим уровнем детализации не поможет. Например, предположим, что этот запрос медленный:

SELECT region, MEASURE(unique_customers) FROM sales_mv GROUP BY ALL

unique_customers использует COUNT(DISTINCT), что неаддитивно. Эта revenue_by_region_date материализация, показанная ранее, имеет другую размерность, поэтому не может использоваться для этого запроса. Создайте материализацию с измерениями, которые соответствуют:

- name: customers_by_region
  type: aggregated
  dimensions:
    - region
  measures:
    - unique_customers

Нерегрегированные материализации

Неагрегированное материализованное представление — это заранее подготовленная отправная точка, а не готовый ответ. Он выполняет дорогостоящие операции объединения таблиц и применения фильтров один раз, поэтому запросы могут агрегироваться из присоединенного результата вместо повторного объединения исходных таблиц во всех запусках.

Агрегирование по-прежнему происходит во время выполнения запроса, поэтому неагрегированные материализации не так быстры, как агрегированные. Они быстрее, чем повторное присоединение из необработанных исходных таблиц на каждом запросе.

В следующих примерах используется представление метрик, которое объединяет три таблицы и применяет фильтр:

source: raw_events
filter: event_type = 'purchase'
joins:
  - name: customers
    source: dim_customers
    on: customers.id = source.customer_id
  - name: products
    source: dim_products
    on: products.id = source.product_id

Какой тип следует использовать для непредсказуемых шаблонов запросов?

Используйте нерегрегированную материализацию. Если вы постоянно выполняете произвольные запросы и не можете предсказать GROUP BY, сложно определить агрегированные материализованные представления, охватывающие нужные поля. Неагрегированная материализация позволяет обойти эту проблему: она однократно материализует объединённый и отфильтрованный набор данных, и любой запрос может использовать его независимо от формы.

materialized_views:
  - name: baseline
    type: unaggregated

Следует ли материализовать одну таблицу без соединений с другими таблицами?

Неагрегированная материализация для одной таблицы без соединений или фильтров просто дублирует таблицу и не даёт никаких преимуществ. Используйте агрегированные материализации для известных шаблонов запросов или не выполняйте материализацию вовсе.

Можно ли использовать оба типа материализации вместе?

Yes. Используйте неагрегированную материализацию в качестве резервного варианта, а агрегированные материализации — для известных вам высоконагруженных запросов. Этот шаблон подходит для представления метрик с ресурсоёмкими объединениями и панелью мониторинга с известными виджетами. Механизм переписывания запросов по возможности в первую очередь использует агрегированные материализации (при точном совпадении или совпадении по сводной агрегации), а во всех остальных случаях переходит к неагрегированным материализациям.

materialized_views:
  - name: baseline
    type: unaggregated
  - name: revenue_by_region_date
    type: aggregated
    dimensions:
      - region
      - order_date
    measures:
      - total_revenue

При создании материализаций в первую очередь ориентируйтесь на самые медленные или наиболее нагруженные запросы. Добавьте дополнительные материализации при наблюдении за запросами, возвращающимися к источнику. Чтобы проверить, использует ли запрос материализацию, см. статью "Проверка использования запроса с материализованными представлениями".