Criar visualizações materializadas
Neste documento, descrevemos como criar visualizações no BigQuery. Antes de ler este documento, veja a Introdução às visualizações materializadas.
Antes de começar
Atribua papéis do Identity and Access Management (IAM) que concedam aos usuários as permissões necessárias para realizar cada tarefa deste documento.
Permissões necessárias
Para criar visualizações materializadas, você precisa da permissão bigquery.tables.create
do IAM.
Cada um dos seguintes papéis predefinidos do IAM inclui as permissões necessárias para criar uma visualização materializada:
bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
Para mais informações sobre o gerenciamento de identidade e acesso (IAM) do BigQuery, consulte Controle de acesso com o IAM.
Criar visualizações materializadas
É possível criar visualizações materializadas do
BigQuery por meio do Console do Google Cloud,
da ferramenta de linha de comando bq
ou da API do BigQuery.
Para os exemplos a seguir, suponha que sua tabela base se chame my_base_table
e tenha o seguinte esquema:
Nome da coluna | Tipo |
---|---|
product_id | integer |
clicks | integer |
Suponha também que você queira uma visualização materializada que resuma o número de cliques por product_id
. As etapas a seguir criam uma visualização materializada chamada my_mv_table
que tem o esquema abaixo.
Nome da coluna | Tipo |
---|---|
product_id | integer |
sum_clicks | integer |
Para criar uma visualização materializada, selecione uma das seguintes opções:
SQL
Use a instrução CREATE MATERIALIZED VIEW
.
O exemplo a seguir cria uma visualização materializada para o número de cliques para cada ID do produto:
No Console do Google Cloud, acesse a página BigQuery.
No editor de consultas, digite a seguinte instrução:
CREATE MATERIALIZED VIEW myproject.mydataset.my_mv_table AS ( SELECT product_id, SUM(clicks) AS sum_clicks FROM myproject.mydataset.my_base_table GROUP BY product_id );
Clique em
Executar.
Para informações sobre como executar consultas, consulte Como executar consultas interativas.
bq
Use o comando
bq query
e forneça a instrução DDL como o parâmetro de consulta.
bq query --use_legacy_sql=false ' CREATE MATERIALIZED VIEW project-id.my_dataset.my_mv_table AS SELECT product_id, SUM(clicks) AS sum_clicks FROM project-id.my_dataset.my_base_table GROUP BY 1'
em que:
- project-id é o ID do projeto.
- my_dataset é o id de um conjunto de dados no projeto;
- my_mv_table é o id da visualização materializada que você está criando;
- my_base_table é o id de uma tabela no conjunto de dados que serve como a tabela base para a visualização materializada;
product_id
é uma coluna da tabela base;clicks
é uma coluna da tabela base;sum_clicks
é uma coluna na visualização materializada que você está criando.
Como alternativa, é possível usar o comando bq mk
com o argumento --materialized_view
para criar uma visualização materializada. Os
argumentos a seguir funcionam com o argumento --materialized_view
:
--enable_refresh
: especifica se a atualização automática está ativada.--refresh_interval_ms
: especifica o tempo, em milissegundos, para a frequência máxima de atualização. Para mais informações sobre o significado desses parâmetros, consulte Atualizar visualizações materializadas.
API
Chame o método
tables.insert
com um recurso materializedView
definido como parte da sua solicitação
de API. O recurso materializedView
contém um campo query
. Exemplo:
{ "kind": "bigquery#table", "tableReference": { "projectId": "project-id", "datasetId": "my_dataset", "tableId": "my_mv_table" }, "materializedView": { "query": "select product_id,sum(clicks) as sum_clicks from project-id.my_dataset.my_base_table group by 1" } }
em que:
- project-id é o ID do projeto.
- my_dataset é o id de um conjunto de dados no projeto;
- my_mv_table é o id da visualização materializada que você está criando;
- my_base_table é o id de uma tabela no conjunto de dados que serve como a tabela base para a visualização materializada;
product_id
é uma coluna da tabela base;clicks
é uma coluna da tabela base;sum_clicks
é uma coluna na visualização materializada que você está criando.
Java
Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.
Quando a visualização materializada é criada, ela aparece no painel Explorer do BigQuery no Console do Google Cloud. As visualizações materializadas são listadas no painel do Explorer no console do Google Cloud. Como exemplo, veja a seguir como o esquema de uma visualização materializada é exibido:
A menos que você desative as atualizações automáticas, o BigQuery iniciará uma atualização completa assíncrona para a visualização materializada. A consulta será concluída rapidamente, mas a atualização inicial poderá continuar em execução.
Controle de acesso
É possível conceder acesso a uma visualização materializada no nível do conjunto de dados, no nível da visualização ou no nível da coluna. Também é possível definir o acesso em um nível superior na hierarquia de recursos do IAM.
Consultar uma visualização materializada requer acesso à visualização, bem como às tabelas base dela. Para compartilhar uma visualização materializada, conceda permissões às tabelas base ou configure uma visualização materializada como uma visualização autorizada. Para mais informações, consulte Visualizações autorizadas.
Para controlar o acesso a visualizações no BigQuery, consulte Visualizações autorizadas.
Compatibilidade com consultas de visualizações materializadas
As visualizações materializadas usam uma sintaxe SQL restrita. As consultas precisam usar o seguinte padrão:
[ WITH cte [, …]] SELECT [{ ALL | DISTINCT }] expression [ [ AS ] alias ] [, ...] FROM from_item [, ...] [ WHERE bool_expression ] [ GROUP BY expression [, ...] ] from_item: { table_name [ as_alias ] | { join_operation | ( join_operation ) } | field_path | unnest_operator | cte_name [ as_alias ] } as_alias: [ AS ] alias
Limitações de consulta
As visualizações materializadas têm as seguintes limitações.
Requisitos agregados
Os agregados na consulta de visualização materializada precisam ser saídas. Não é possível computar ou
filtrar com base em um valor agregado. Por exemplo, não é possível criar uma visualização pela consulta a seguir porque ela produz um valor calculado com base em um agregado, COUNT(*) / 10 as cnt
.
SELECT TIMESTAMP_TRUNC(ts, HOUR) AS ts_hour, COUNT(*) / 10 AS cnt FROM mydataset.mytable GROUP BY ts_hour;
No momento, apenas as seguintes funções de agregação são compatíveis:
ANY_VALUE
(mas não acima deSTRUCT
)APPROX_COUNT_DISTINCT
ARRAY_AGG
(mas não acima deARRAY
ouSTRUCT
)AVG
BIT_AND
BIT_OR
BIT_XOR
COUNT
COUNTIF
HLL_COUNT.INIT
LOGICAL_AND
LOGICAL_OR
MAX
MIN
SUM
Recursos do SQL incompatíveis
Os seguintes recursos do SQL não são compatíveis com as visualizações materializadas:
- Junções externas esquerda/direita/completas.
- Mesclagens automáticas (com a mesma tabela mais de uma vez).
- Funções de janela
- Subconsultas ARRAY.
- Funções não determinísticas, como RAND(), CURRENT_DATE(), SESSION_USER() ou CURRENT_TIME().
- funções definidas pelo usuário (UDFs)
- TABLESAMPLE.
- FOR SYSTEM_TIME AS OF.
Restrições de controle de acesso
- Se a consulta de uma visualização materializada de um usuário incluir colunas de tabela de base
que não podem ser acessadas devido à segurança no nível da coluna, a consulta falhará
com a mensagem
Access Denied
. - Se um usuário consulta uma visualização materializada, mas não tem acesso total a todas as linhas das tabelas de base das visualizações materializadas, o BigQuery executa a consulta nas tabelas de base em vez de ler dados de visualizações materializadas. Isso garante que a consulta respeite todas as restrições de controle de acesso. Essa limitação também se aplica à consulta de tabelas com colunas com máscara de dados.
Cláusulas WITH
e expressões comuns da tabela (CTEs, na sigla em inglês)
As visualizações materializadas são compatíveis com cláusulas WITH
e expressões comuns de tabelas.
As visualizações materializadas com cláusulas WITH
ainda precisam seguir o padrão e
as limitações das visualizações materializadas sem cláusulas WITH
.
Examples
O exemplo a seguir mostra uma visualização materializada usando uma cláusula WITH
.
WITH tmp AS ( SELECT TIMESTAMP_TRUNC(ts, HOUR) AS ts_hour, * FROM mydataset.mytable ) SELECT ts_hour, COUNT(*) AS cnt FROM tmp GROUP BY ts_hour;
O exemplo a seguir mostra uma visualização materializada usando uma cláusula WITH
que
não é compatível porque contém duas cláusulas GROUP BY
:
WITH tmp AS ( SELECT city, COUNT(*) AS population FROM mydataset.mytable GROUP BY city ) SELECT population, COUNT(*) AS cnt GROUP BY population;
Visualizações materializadas sobre tabelas do BigLake
Para criar visualizações materializadas sobre as tabelas
do BigLake, a
tabela do BigLake precisa ter o cache de metadados
ativado sobre os
dados do Cloud Storage e a visualização materializada precisa ter um
valor de opção max_staleness
maior do que a tabela base.
As visualizações materializadas em tabelas do BigLake aceitam o mesmo conjunto de
consultas que outras
visualizações materializadas.
Exemplo
Criação de uma visualização agregada simples usando uma tabela base do BigLake:
CREATE MATERIALIZED VIEW sample_dataset.sample_mv OPTIONS (max_staleness=INTERVAL "0:30:0" HOUR TO SECOND) AS SELECT COUNT(*) cnt FROM dataset.biglake_base_table;
Para detalhes sobre as limitações das visualizações materializadas sobre as tabelas do BigLake, consulte visualizações materializadas sobre tabelas do BigLake.
Visualizações materializadas particionadas
As visualizações materializadas em tabelas particionadas podem ser particionadas. O particionamento de uma visualização materializada é semelhante ao particionamento de uma tabela normal, visto que é vantajoso quando as consultas costumam acessar um subconjunto das partições. Além disso, particionar uma visualização materializada pode melhorar o comportamento da visualização quando os dados na tabela ou tabelas base forem modificados ou excluídos. Para mais informações, consulte Alinhamento de partição.
Se a tabela base for particionada, particione uma visualização materializada na mesma coluna de particionamento. Para partições baseadas em tempo, a granularidade precisa corresponder (por hora, dia, mês ou ano). Para partições por intervalo de números inteiros, a especificação do intervalo precisa corresponder exatamente. Não é possível particionar uma visualização materializada em uma tabela base não particionada.
Se a tabela base é particionada por tempo de processamento, uma visualização materializada pode
ser agrupada pela coluna _PARTITIONDATE
da tabela base e também particionada por ela.
Se você não especificar explicitamente o particionamento ao criar a visualização materializada, ela não será particionada.
Se a tabela base for particionada, considere particionar sua visualização materializada para reduzir os custos de atualização do job de atualização e o custo de consulta.
Expiração da partição
Nas visualizações materializadas, a expiração da partição não pode ser configurada. Uma visualização materializada herda implicitamente o prazo de validade da partição da tabela base. As partições de visualização materializadas são alinhadas com as partições de tabela base, por isso expiram de forma síncrona.
Exemplo 1
Neste exemplo, a tabela base é particionada na coluna transaction_time
com partições diárias. A visualização materializada é particionada na mesma coluna
e agrupada na coluna employee_id
.
CREATE TABLE my_project.my_dataset.my_base_table( employee_id INT64, transaction_time TIMESTAMP) PARTITION BY DATE(transaction_time) OPTIONS (partition_expiration_days = 2); CREATE MATERIALIZED VIEW my_project.my_dataset.my_mv_table PARTITION BY DATE(transaction_time) CLUSTER BY employee_id AS ( SELECT employee_id, transaction_time, COUNT(employee_id) AS cnt FROM my_dataset.my_base_table GROUP BY employee_id, transaction_time );
Exemplo 2
Neste exemplo, a tabela base é particionada por tempo de processamento com partições
diárias. A visualização materializada seleciona o tempo de ingestão como uma coluna
chamada date
. A visualização materializada é agrupada pela coluna date
e particionada pela
mesma coluna.
CREATE MATERIALIZED VIEW my_project.my_dataset.my_mv_table PARTITION BY date CLUSTER BY employee_id AS ( SELECT employee_id, _PARTITIONDATE AS date, COUNT(1) AS count FROM my_dataset.my_base_table GROUP BY employee_id, date );
Exemplo 3
Neste exemplo, a tabela base é particionada em uma coluna TIMESTAMP
chamada
transaction_time
, com partições diárias. A visualização materializada define uma
coluna chamada transaction_hour
, usando a função
TIMESTAMP_TRUNC
para truncar o valor para a hora mais próxima. A visualização materializada é
agrupada por transaction_hour
e também particionada por ela.
Observações:
A função de truncamento aplicada à coluna de particionamento precisa ser pelo menos tão granular quanto o particionamento da tabela base. Por exemplo, se a tabela base usa partições diárias, a função de truncamento não pode usar a granularidade
MONTH
ouYEAR
.Na especificação da partição da visualização materializada, a granularidade precisa corresponder à tabela base.
CREATE TABLE my_project.my_dataset.my_base_table ( employee_id INT64, transaction_time TIMESTAMP) PARTITION BY DATE(transaction_time); CREATE MATERIALIZED VIEW my_project.my_dataset.my_mv_table PARTITION BY DATE(transaction_hour) AS ( SELECT employee_id, TIMESTAMP_TRUNC(transaction_time, HOUR) AS transaction_hour, COUNT(employee_id) AS cnt FROM my_dataset.my_base_table GROUP BY employee_id, transaction_hour );
Visualizações materializadas do cluster
É possível agrupar visualizações materializadas por colunas de saída, sujeitas às limitações de tabelas em cluster do BigQuery. Não é possível usar colunas de saída agregadas como colunas de clustering. Adicionar colunas de clustering a visualizações materializadas pode melhorar o desempenho das consultas que incluem filtros nessas colunas.
Considerações ao criar visualizações materializadas
Quais visualizações materializadas serão criadas
Ao criar uma visualização materializada, verifique se a definição de visualização materializada reflete os padrões de consulta nas tabelas base. Como há no máximo 20 visualizações materializadas por tabela, não crie uma visualização materializada para cada troca de uma consulta. Em vez disso, crie visualizações materializadas para veicular um conjunto mais amplo de consultas.
Por exemplo, considere uma consulta em uma tabela em que os usuários geralmente filtram pelas colunas user_id
ou department
. É possível agrupar por essas colunas e, opcionalmente, realizar o clustering por elas, em vez de adicionar filtros como user_id = 123
à visualização materializada.
Como outro exemplo, os usuários geralmente usam filtros de data, por data específica, como WHERE order_date = CURRENT_DATE()
, ou por período, como WHERE order_date
BETWEEN '2019-10-01' AND '2019-10-31'
. Adicione um filtro por período à visualização materializada que abrange os períodos esperados na consulta:
CREATE MATERIALIZED VIEW ... ... WHERE date > '2019-01-01' GROUP BY date
Mesclagens
As recomendações a seguir se aplicam a visualizações materializadas com JOINs.
Colocar primeiro a tabela que muda com mais frequência
Garanta que a maior tabela ou a mais alterada seja a primeira/mais à esquerda referenciada na consulta de visualização. As visualizações materializadas com junções são compatíveis com consultas incrementais e atualizadas quando a primeira tabela ou a mais à esquerda na consulta é anexada, mas alterações em outras tabelas invalidam totalmente o cache da visualização. Em esquemas em estrela ou floco de neve, a primeira tabela ou a tabela mais à esquerda geralmente precisa ser a tabela de fatos.
Evitar mesclagem em chaves de clustering
As visualizações materializadas com mesclas funcionam melhor nos casos em que os dados são muito agregados ou a consulta de mescla original é cara. Para consultas seletivas, o BigQuery, em geral, já é capaz de executar a mescla com eficiência e nenhuma visualização materializada é necessária. Por exemplo, considere as seguintes definições de visualização materializada.
CREATE MATERIALIZED VIEW dataset.mv CLUSTER BY s_market_id AS ( SELECT s_market_id, s_country, SUM(ss_net_paid) AS sum_sales, COUNT(*) AS cnt_sales FROM dataset.store_sales INNER JOIN dataset.store ON ss_store_sk = s_store_sk GROUP BY s_market_id, s_country );
Suponha que store_sales
esteja em cluster em ss_store_sk
e você geralmente execute consultas como esta:
SELECT SUM(ss_net_paid) FROM dataset.store_sales INNER JOIN dataset.store ON ss_store_sk = s_store_sk WHERE s_country = 'Germany';
A visualização materializada pode não ser tão eficiente quanto a consulta original. Para melhores resultados, execute um conjunto representativo de consultas, com e sem a visualização materializada.
Usar visualizações materializadas com a opção max_staleness
A opção de visualização materializada max_staleness
ajuda você a ter um desempenho consistente
e alto com custos controlados ao processar grandes conjuntos de dados que
mudam com frequência. Com o parâmetro max_staleness
, é possível ajustar a atualização dos resultados para ajustar o desempenho da consulta. Esse comportamento pode ser útil para painéis
e relatórios em que a atualização de dados não é essencial.
Criar visualizações materializadas com a opção max_staleness
Ao criar a visualização materializada, adicione uma OPÇÃO à instrução DDL:
Console
Para criar uma visualização materializada no console do Google Cloud com a opção max_staleness
, adicione OPTION à instrução DDL ao criar a visualização materializada:
Acesse a página do BigQuery.
Clique em Escrever nova consulta.
Insira a instrução DDL
CREATE MATERIALIZED VIEW
na área de texto Editor.CREATE MATERIALIZED VIEW
project-id.my_dataset.my_mv_table
OPTIONS (enable_refresh = true, refresh_interval_minutes = 60, max_staleness = INTERVAL "4:0:0" HOUR TO SECOND) AS SELECT employee_id, DATE(transaction_time), COUNT(1) AS count FROMmy_dataset.my_base_table
GROUP BY 1, 2;Substitua:
- project-id é o ID do projeto.
- my_dataset é o id de um conjunto de dados no projeto;
- my_mv_table é o id da visualização materializada que você está criando;
- my_base_table é o id de uma tabela no conjunto de dados que serve como a tabela base para a visualização materializada;
Clique em Executar.
API
Chame o método
tables.insert
com um recurso materializedView
definido como parte da sua solicitação
de API. O recurso materializedView
contém um campo query
. Exemplo:
{ "kind": "bigquery#table", "tableReference": { "projectId": "project-id", "datasetId": "my_dataset", "tableId": "my_mv_table" }, "materializedView": { "query": "select product_id,sum(clicks) as sum_clicks from project-id.my_dataset.my_base_table group by 1" } "maxStaleness": "4:0:0 HOUR TO SECOND" } }
Substitua:
- project-id é o ID do projeto.
- my_dataset é o id de um conjunto de dados no projeto;
- my_mv_table é o id da visualização materializada que você está criando;
- my_base_table é o id de uma tabela no conjunto de dados que serve como a tabela base para a visualização materializada;
product_id
é uma coluna da tabela base;clicks
é uma coluna da tabela base;sum_clicks
é uma coluna na visualização materializada que você está criando.
Aplicar a opção max_staleness
às visualizações materializadas
É possível aplicar esse parâmetro às visualizações materializadas atuais usando a instrução ALTER
MATERIALIZED VIEW
. Exemplo:
ALTER MATERIALIZED VIEW project-id.my_dataset.my_mv_table SET OPTIONS (enable_refresh=true, refresh_interval_minutes = 120, max_staleness = INTERVAL "8:0:0" HOUR TO SECOND)
Consultar visualizações materializadas com max_staleness
É possível consultar visualizações materializadas com a opção max_staleness
, como você
consultaria qualquer visualização materializada, visualização lógica ou tabela.
Exemplo:
SELECT * FROM project-id.my_dataset.my_mv_table
Essa consulta retorna dados da última atualização se eles não forem mais antigos que o
parâmetro max_staleness
. Se a visualização materializada não tiver sido atualizada
no intervalo max_staleness
, o BigQuery vai mesclar os resultados da
atualização mais recente disponível com as mudanças na tabela base para retornar resultados dentro
do intervalo max_staleness
.
Inatividade dos dados
Quando você consulta visualizações materializadas com max_staleness
, o BigQuery
retorna dados consistentes com o resultado de uma consulta de visualização materializada que foi
executada no intervalo max_staleness
.
A consulta é executada de acordo com as seguintes condições:
Se a última atualização estiver no intervalo
max_staleness
, o BigQuery retornará dados diretamente da visualização materializada sem ler as tabelas base.Se a última atualização estiver fora do intervalo
max_staleness
, além de ler os dados da visualização materializada, o BigQuery também vai ler dados suficientes das tabelas base para retornar dados combinados que estejam dentro do intervalo de inatividade.
Streaming de dados e resultados da max_staleness
Se você transmitir dados para a tabela base de uma visualização materializada com a
opção max_staleness
, a consulta da visualização materializada pode excluir
registros transmitidos para a tabela antes do início do intervalo de
inatividade.
Ajuste inteligente e a opção max_staleness
O ajuste inteligente reescreve de modo automático as consultas para usar visualizações materializadas sempre que
possível, mesmo que a consulta não se refira a uma visualização materializada. A
opção max_staleness
em uma visualização materializada não afeta os resultados da
consulta reescrita. A opção max_staleness
afeta apenas as consultas que consultam diretamente
a visualização materializada.
Gerenciar a inatividade e atualizar a frequência
Defina max_staleness
com base nos seus requisitos. Para evitar a leitura
de dados das tabelas base, configure o intervalo de atualização para que a atualização ocorra
no intervalo de inatividade. É possível considerar o tempo de execução médio de atualização
além de uma margem para crescimento.
Por exemplo, se uma hora for necessária para atualizar a visualização materializada e você quiser um buffer de uma hora para crescimento, defina o intervalo de atualização como duas horas. Essa configuração garante que a atualização ocorra dentro do máximo de quatro horas do seu relatório para inatividade.
CREATE MATERIALIZED VIEW project-id.my_dataset.my_mv_table OPTIONS (enable_refresh = true, refresh_interval_minutes = 120, max_staleness = INTERVAL "4:0:0" HOUR TO SECOND) AS SELECT employee_id, DATE(transaction_time), COUNT(1) AS cnt FROM my_dataset.my_base_table GROUP BY 1, 2;