Usar visualizações materializadas
Neste documento, você encontra mais informações sobre as visualizações materializadas e como usá-las. Antes de ler este documento, veja Introdução às visualizações materializadas e Criar visualizações materializadas.
Consultar visualizações materializadas
É possível consultar visualizações materializadas diretamente, da mesma forma que consulta tabelas ou visualizações padrão. As consultas nas visualizações materializadas são sempre consistentes com as consultas nas tabelas base da visualização, mesmo que elas tenham sido alteradas desde a última atualização da visualização materializada. As consultas não acionam automaticamente uma atualização materializada.
Funções exigidas
Para ter as permissões necessárias para consultar uma visualização materializada,
peça ao seu administrador para conceder a você o papel Leitor de dados do BigQuery (roles/bigquery.dataViewer
) do IAM na tabela base da visualização materializada e da própria visualização materializada.
Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.
Esse papel predefinido contém as permissões necessárias para consultar uma visualização materializada. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:
Permissões necessárias
As seguintes permissões são necessárias para consultar uma visualização materializada:
-
bigquery.tables.get
-
bigquery.tables.getData
Essas permissões também podem ser concedidas com papéis personalizados ou outros papéis predefinidos.
Essas permissões são necessárias para consultas para que você possa se beneficiar do ajuste inteligente.
Para mais informações sobre os papéis do IAM no BigQuery, consulte Introdução ao IAM.
Atualizações incrementais
O BigQuery combina os dados de visualização em cache com os novos dados para fornecer
resultados de consulta consistentes enquanto ainda usa a visualização materializada. Para visualizações materializadas de tabela única, isso será possível se a tabela base não tiver sido alterada desde a última atualização ou se apenas novos dados forem adicionados. Para visualizações JOIN
, apenas
as tabelas do lado esquerdo do JOIN
podem ter dados anexados. Se uma das
tabelas no lado direito de um JOIN
tiver mudado, a visualização não poderá ser
atualizada de forma incremental.
Se a tabela base tiver atualizações ou exclusões desde a última atualização ou se as tabelas base da visualização materializada no lado direito da JOIN
tiverem mudado, o BigQuery vai reverter automaticamente para a consulta original. Para mais informações sobre mesclagens e visualizações materializadas, consulte Mesclagens. Veja a seguir exemplos do console do Google Cloud, da ferramenta de linha de comando bq e das ações da API que podem causar uma atualização ou exclusão:
- Declarações de linguagem de manipulação de dados (DML, na sigla em inglês)
UPDATE
,MERGE
ouDELETE
- Truncamento
- Expiração da partição
As seguintes operações de metadados também impedem que uma visualização materializada seja atualizada de forma incremental:
- Alterar a validade da partição
- Atualizar ou descartar uma coluna
Se uma visualização materializada não puder ser atualizada de forma incremental, os dados armazenados em cache não serão usados pelas consultas até que a visualização seja atualizada de forma automática ou manual. Para detalhes sobre por que um job não usou dados de visualização materializada, consulte Entender por que as visualizações materializadas foram rejeitadas.
Alinhamento de partições
Se uma visualização materializada for particionada, o BigQuery garante que as
partições sejam alinhadas com as partições da coluna de particionamento da tabela
base. Alinhado significa que os dados de uma partição específica da
tabela base contribuem para a mesma partição da visualização materializada. Por
exemplo, uma linha da partição 20220101
da tabela base contribuiria apenas
para a partição 20220101
da visualização materializada.
Quando uma visualização materializada é particionada, o comportamento descrito nas Atualizações incrementais ocorre para cada partição individual. Por exemplo, se os dados forem excluídos em uma partição da tabela base, o BigQuery ainda poderá usar as outras partições da visualização materializada.
As visualizações materializadas com junções internas só podem ser alinhadas com uma das respectivas tabelas base. Se uma das tabelas base não alinhadas for alterada, ela afetará toda a visualização.
Ajuste inteligente
O BigQuery regrava automaticamente consultas para usar visualizações materializadas sempre que possível. A regravação automática melhora o desempenho e o custo da consulta, além de não alterar os resultados. As consultas não acionam automaticamente uma atualização materializada. Para que uma consulta seja regravada, a visualização materializada precisa atender às seguintes condições:
- Pertencer ao mesmo conjunto de dados que uma das tabelas base
- Usar o mesmo conjunto de tabelas base que a consulta
- Incluir todas as colunas que estão sendo lidas
- Incluir todas as linhas que estão sendo lidas
Exemplos de ajustes inteligentes
Veja o seguinte exemplo de consulta de visualização materializada:
SELECT store_id, CAST(sold_datetime AS DATE) AS sold_date SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL GROUP BY 1, 2
Os exemplos a seguir mostram consultas e por que elas foram ou não regravadas automaticamente usando esta visualização.
Query | Regravar? | Motivo |
---|---|---|
SELECT SUM(net_paid) AS sum_paid, SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL |
Não | A visualização precisa incluir todas as colunas que estão sendo lidas. A visualização não inclui "SUM(net_paid)". |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL |
Sim | |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL AND customer_id = 12345 |
Não | A visualização precisa incluir todas as colunas que estão sendo lidas.s A visualização não inclui "cliente". |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE sold_datetime= '2021-01-01' AND promo_id IS NOT NULL |
Não | A visualização precisa incluir todas as colunas que estão sendo lidas. "sold_datetime" não é um resultado, mas "CAST(sold_datetime AS DATE" é). |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL AND store_id = 12345 |
Sim | |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id = 12345 |
Não | A visualização precisa incluir todas as linhas que estão sendo lidas. "promo_id" não é uma saída, por isso o filtro mais restritivo não pode ser aplicado à visualização. |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2020-01-01' |
Não | A visualização precisa incluir todas as linhas que estão sendo lidas. O filtro de visualização para datas a partir de 2021, mas a consulta lê as datas a partir de 2020. |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2022-01-01' AND promo_id IS NOT NULL |
Sim |
Entender se uma consulta foi reescrita
Para entender se uma consulta foi reescrita pelo ajuste inteligente para usar uma visualização materializada, inspecione o plano de consulta. Se a consulta foi reescrita, o plano de consulta contém uma etapa READ my_materialized_view
, em que my_materialized_view
é o nome da visualização materializada usada. Para entender por que uma consulta não usou uma visualização materializada, consulte Entenda por que as visualizações materializadas foram rejeitadas.
Entenda por que as visualizações materializadas foram rejeitadas
As consultas não podem usar uma visualização materializada por vários motivos. As etapas para entender por que uma visualização materializada foi rejeitada dependem do tipo de consulta que você usou:
- Consulta direta da visualização materializada
- Consulta indireta em que o ajuste inteligente pode usar a visualização materializada
As seções a seguir fornecem etapas para ajudar você a entender por que uma visualização materializada foi rejeitada.
Consulta direta de visualizações materializadas
As consultas diretas de visualizações materializadas podem não usar dados armazenados em cache em determinadas circunstâncias. As etapas a seguir podem ajudar você a entender por que os dados da visualização materializada não foram usados:
- Siga as etapas em Monitorar o uso
da visualização materializada
e encontre a visualização materializada de destino no
campo
materialized_view_statistics
da consulta. do Google Analytics. - Se
chosen
estiver presente nas estatísticas e o valor forTRUE
, a visualização materializada será usada pela consulta. - Consulte o campo
rejected_reason
para ver as próximas etapas. Na maioria dos casos, é possível atualizar manualmente a visualização materializada ou aguardar a próxima atualização automática.
Consulta com ajuste inteligente
- Siga as etapas em Monitorar o uso
da visualização materializada
e encontre a visualização materializada de destino no
materialized_view_statistics
para a consulta. - Consulte a
rejected_reason
para ver as próximas etapas. Por exemplo, se o valorrejected_reason
forCOST
, o ajuste inteligente identificou fontes de dados mais eficientes para custo e desempenho. - Se a visualização materializada não estiver presente, tente uma consulta direta da visualização materializada e siga as etapas em Consulta direta de visualizações materializadas.
- Se a consulta direta não usar a visualização materializada, a forma da visualização materializada não corresponderá à consulta. Para mais informações sobre o ajuste inteligente e como as consultas são reescritas usando visualizações materializadas, consulte Exemplos de ajuste inteligente.
Perguntas frequentes
Quando devo usar consultas programadas e visualizações materializadas?
As consultas programadas são uma maneira conveniente de executar cálculos arbitrariamente complexos periodicamente. Sempre que a consulta for executada, ela será executada por completo. Os resultados anteriores não serão usados, e você pagará o preço total pela consulta. As consultas programadas são ótimas quando você não precisar dos dados mais recentes e tiver alta tolerância com a desatualização dos dados.
As visualizações materializadas são adequadas para quando for necessário consultar os dados mais recentes e reduzir a latência e o custo com a reutilização do resultado calculado anteriormente. É possível usar visualizações materializadas como pseudoíndices, acelerando consultas para a tabela base sem atualizar fluxos de trabalho existentes. A opção --max_staleness
permite definir uma inatividade aceitável para visualizações materializadas, fornecendo
um desempenho consistentemente alto com custos controlados ao processar
conjuntos de dados grandes e que mudam com frequência.
Como orientação geral, sempre que possível e se cálculos arbitrariamente complexos não estiverem sendo executados, use as visualizações materializadas.
Algumas consultas em visualizações materializadas são mais lentas do que as mesmas consultas em tabelas materializadas manualmente. E qual a explicação?
Em geral, uma consulta em uma visualização materializada nem sempre é tão eficiente quanto uma consulta na tabela materializada equivalente. O motivo é que uma visualização materializada garante que sempre retorne um novo resultado, além de considerar as alterações nas tabelas base que foram adicionadas desde a última atualização de visualização.
Imagine esta situação:
CREATE MATERIALIZED VIEW my_dataset.my_mv AS SELECT date, customer_id, region, SUM(net_paid) as total_paid FROM my_dataset.sales GROUP BY 1, 2, 3; CREATE TABLE my_dataset.my_materialized_table AS SELECT date, customer_id, region, SUM(net_paid) as total_paid FROM my_dataset.sales GROUP BY 1, 2, 3;
Por exemplo, esta consulta:
SELECT * FROM my_dataset.my_mv LIMIT 10normalmente é executada muito mais lentamente do que esta:
SELECT * FROM my_dataset.my_materialized_table LIMIT 10Para fornecer resultados atualizados de maneira consistente, o BigQuery precisa consultar novas linhas na tabela base e mesclá-las na visualização materializada antes de aplicar o predicado "LIMIT 10". Como resultado, a lentidão permanece, mesmo que a visualização materializada esteja totalmente atualizada.
Por outro lado, as agregações nas visualizações materializadas geralmente são tão rápidas quanto as consultas na tabela materializada. Por exemplo, os seguintes URLs:
SELECT SUM(total_paid) FROM my_dataset.my_mv WHERE date > '2020-12-01'A velocidade precisa ser assim:
SELECT SUM(total_paid) FROM my_dataset.my_materialized_table WHERE date > '2020-12-01'