Como consultar tabelas em cluster

Como consultar tabelas em cluster

Quando você cria uma tabela em cluster no BigQuery, os dados da tabela são organizados automaticamente com base no conteúdo de uma ou mais colunas no esquema da tabela. As colunas especificadas são usadas para colocar dados relacionados. Quando você cria uma tabela em cluster usando várias colunas, a ordem das colunas especificadas é importante. A ordem das colunas especificadas determina a ordem de classificação dos dados.

Para otimizar o desempenho de consultas em tabelas em cluster, use uma expressão que filtre em uma coluna em cluster ou em várias colunas em cluster, na ordem em que essas colunas estiverem especificadas. Consultas que filtram colunas em cluster geralmente têm melhor desempenho que as que filtram somente colunas que não estão em cluster.

O BigQuery classifica os dados em uma tabela em cluster com base nos valores existentes nas colunas em cluster e os organiza em blocos.

Quando você envia uma consulta que contém um filtro em uma coluna em cluster, o BigQuery usa as informações do cluster para determinar com eficiência se há dados relevantes para a consulta em um bloco. Desse modo, o BigQuery analisa apenas os blocos relevantes com um processo conhecido como "remoção de blocos".

Para consultar tabelas em cluster:

  • Use o Console do GCP ou a IU clássica da Web do BigQuery.
  • use o comando bq query da ferramenta de linha de comando;
  • Chame o método de API jobs.insert e configure um job de consulta.
  • Use bibliotecas de cliente.

Somente o SQL padrão pode ser usado com tabelas em cluster.

Permissões exigidas

Para consultar uma tabela, é necessário ter, no mínimo, as permissões bigquery.tables.getData.

Os papéis predefinidos do Cloud IAM a seguir incluem as permissões bigquery.tables.getData:

  • bigquery.dataViewer
  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

Além disso, quando um usuário com permissões bigquery.datasets.create cria um conjunto de dados, recebe o acesso bigquery.dataOwner a ele. Com o acesso de bigquery.dataOwner, o usuário consegue consultar tabelas e visualizações no conjunto de dados.

Você também precisa ter permissões de bigquery.jobs.create para executar consulta de jobs. Os papéis predefinidos do Cloud IAM a seguir incluem as permissões bigquery.jobs.create:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

Para mais informações sobre papéis e permissões do Cloud IAM no BigQuery, consulte Controle de acesso.

Práticas recomendadas

Para conseguir o melhor desempenho das consultas em tabelas em cluster, use as seguintes práticas recomendadas.

Tabela de amostra usada nos exemplos

A tabela de amostra usada nos exemplos desta página é uma tabela em cluster criada com uma instrução DDL. A instrução DDL cria uma tabela denominada ClusteredSalesData. A tabela é agrupada pelas seguintes colunas: primeiro por customer_id depois por product_id depois por order_id.

CREATE TABLE
  `mydataset.ClusteredSalesData`
PARTITION BY
  DATE(timestamp)
CLUSTER BY
  customer_id,
  product_id,
  order_id AS
SELECT
  *
FROM
  `mydataset.SalesData`

Filtrar colunas em cluster na ordem em que são especificadas

Ao especificar um filtro, use expressões que filtrem as colunas em cluster na ordem de classificação.

A consulta a seguir inclui uma expressão que filtra por customer_id e depois por product_id. Essa consulta otimiza o desempenho filtrando as colunas em cluster na ordem de classificação.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = 10000
  AND product_id LIKE 'gcp_analytics%'

A consulta a seguir não filtra as colunas em cluster na ordem de classificação. Por isso, o desempenho da consulta não é o ideal. Essa consulta filtra em product_id depois em order_id (ignorando customer_id).

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  product_id LIKE 'gcp_analytics%'
  AND order_id = 20000

Não use colunas em cluster nas expressões de filtro complexas

Se você usar uma expressão de filtro complexa em uma coluna em cluster, o desempenho da consulta não será otimizado porque a remoção de bloco não será aplicada.

Por exemplo, a consulta a seguir não remove os blocos porque uma coluna em cluster - customer_id - é usada em uma função na expressão de filtro.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  CAST(customer_id AS STRING) = "10000"

Para otimizar o desempenho da consulta removendo blocos, use expressões de filtro simples, como as seguintes. Neste exemplo, um filtro simples é aplicado à coluna em cluster - customer_id.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = 10000

Não compare colunas em cluster com outras colunas

Se uma expressão de filtro comparar uma coluna em cluster a outra (coluna em cluster ou não em cluster), o desempenho da consulta não será otimizado porque a remoção de bloco não poderá ser aplicada.

A consulta a seguir não remove os blocos porque a expressão de filtro compara uma coluna em cluster - customer_id com outra coluna - order_id.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = order_id

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.