Pular para o conteúdo principal

Escolher um tipo de materialização para view de métricas

Esta página descreve como selecionar entre materializações agregadas e não agregadas para views de métricas com base nos seus padrões de query. Para o que cada tipo é e como funciona, consulte Tipos de materializações para views de métricas.

Use a tabela a seguir para encontrar a abordagem correta para a sua situação. As seções a seguir respondem a cada pergunta em detalhes.

Sua situação

Abordagem

Você executa os mesmos padrões de query com frequência e sabe por quais dimensões agrupa.

Materialização agregada

Você query uma medida não aditiva, como COUNT(DISTINCT), em uma granularidade fixa.

Materialização agregada com dimensões que correspondem às da query GROUP BY

É possível executar queries ad hoc sobre dados unidos ou filtrados e não é possível prever o GROUP BY.

Materialização não agregada

Possui dashboards previsíveis e query ad hoc na mesma view de métricas.

Ambos os tipos juntos

Sua view de métricas aponta para uma única tabela, sem joins ou filtros.

Nenhuma; use materializações agregadas para padrões conhecidos ou ignore a materialização

Sua situação

Abordagem

Você executa os mesmos padrões de query com frequência e sabe por quais dimensões agrupa.

Materialização agregada

Você query uma medida não aditiva, como COUNT(DISTINCT), em uma granularidade fixa.

Materialização agregada com dimensões que correspondem às da query GROUP BY

É possível executar queries ad hoc sobre dados unidos ou filtrados e não é possível prever o GROUP BY.

Materialização não agregada

Possui dashboards previsíveis e query ad hoc na mesma view de métricas.

Ambos os tipos juntos

Sua view de métricas aponta para uma única tabela, sem joins ou filtros.

Nenhuma; use materializações agregadas para padrões conhecidos ou ignore a materialização

Materializações agregadas​

Uma materialização agregada é uma tabela de respostas pré-construída para um tipo específico de pergunta. Ele atende a queries correspondentes mais rapidamente, retornando resultados pré-computados em vez de escanear dados de origem.

Os exemplos a seguir usam uma view de métricas em dados de ventas com os campos region, category e order_date, e as medidas total_revenue (SUM), order_count (COUNT) e unique_customers (COUNT(DISTINCT)).

Como acelerar uma query que executo com frequência?​

Crie uma materialização agregada para ela. Uma query que o senhor executa diariamente é uma boa candidata, pois a materialização retorna resultados pré-computados em vez de examinar os dados de origem. Por exemplo: suponha que o senhor execute esta query todas as manhãs:

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

Se você consulta region e order_date comumente juntos, inclua ambos os campos em uma materialização:

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

Materializar em um nível de detalhe mais fino (região e data em vez de apenas região) significa que qualquer query que agrupa por region sozinho, order_date sozinho, ou ambos pode usar esta materialização. Incluir medidas aditivas como order_count permite que a mesma materialização atenda a queries para essas medidas, então você não precisa criar uma separada para cada.

Como saber se uma materialização existente cobre uma nova query?​

Compare as GROUP BY dimensões da query com as dimensões da materialização. Se a materialização não incluir uma dimensão pela qual agrupar, a query não poderá usá-la. Por exemplo, suponha que queira a receita por category, mas sua única materialização seja o exemplo revenue_by_region_date mostrado anteriormente. Como não inclui category, as queries que agrupam por category recorrem a uma materialização não agregada (se existir) ou às tabelas de origem.

Se você fizer consultas por category com frequência, crie uma materialização separada para isso. Se a query for infrequente ou já for rápida o suficiente, não crie uma. Cada materialização adiciona custo de armazenamento e refresh.

Como faço para acelerar uma query com uma medida não aditiva?​

Crie uma materialização agregada cujas dimensões correspondam exatamente à GROUP BY da query. Medidas não aditivas, como COUNT(DISTINCT), não podem ser agregadas a partir de uma materialização mais granular, portanto, uma materialização com granularidade diferente não ajudará. Por exemplo, suponha que esta query seja lenta:

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

unique_customers usa COUNT(DISTINCT), que não é aditivo. A materialização revenue_by_region_date mostrada anteriormente tem dimensões diferentes, portanto, não pode atender a esta query. Crie uma materialização com dimensões que correspondam:

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

Materializações não agregadas​

Uma materialização não agregada é um ponto de partida pré-construído, não uma resposta pré-construída. Ele executa o trabalho dispendioso de unir tabelas e aplicar filtros uma vez, para que as consultas possam agregar a partir do resultado da junção, em vez de unir novamente as tabelas de origem a cada execução.

A agregação ainda ocorre no momento da query, portanto, as materializações não agregadas não são tão rápidas quanto as agregadas. Elas são mais rápidas do que refazer a junção das tabelas de origem brutas a cada query.

Os exemplos a seguir usam uma view de métricas que join três tabelas e aplica um filtro:

YAML
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

Que tipo devo usar para padrões de query imprevisíveis?​

Use uma materialização não agregada. Quando você executa queries ad hoc constantemente e não consegue prever o GROUP BY, é difícil definir materializações agregadas que cubram os campos corretos. Uma materialização não agregada contorna este problema: ela materializa o dataset unido e filtrado uma vez, e qualquer query pode usá-lo independentemente de sua forma.

YAML
materialized_views:
- name: baseline
type: unaggregated

Devo materializar uma única tabela sem joins?​

Uma materialização não agregada em uma única tabela sem *joins* ou filtros duplica a tabela sem benefício. Use materializações agregadas para padrões de *query* conhecidos ou pule a materialização completamente.

Posso usar ambos os tipos de materialização juntos?​

Sim. Use uma materialização não agregada como fallback e materializações agregadas para suas consultas de alto tráfego conhecidas. Este padrão se encaixa em uma view de métricas que tem joins caros, juntamente com um painel de widgets conhecidos. A reescrita de query prefere materializações agregadas (correspondência exata ou de rollup) quando possível e usa o fallback para não agregada para todo o resto.

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

Ao criar materializações, direcione primeiro suas queries mais lentas ou com maior tráfego. Adicione mais materializações quando observar que as queries estão voltando para a origem. Para verificar se uma query utiliza uma materialização, consulte Verificar se uma query está usando visualizações materializadas.