Cómo consultar tablas agrupadas

Cómo consultar tablas agrupadas

Cuando creas una tabla agrupada en clústeres en BigQuery, los datos de la tabla se organizan automáticamente según el contenido de una o más columnas en el esquema de la tabla. Las columnas que especificas se utilizan para colocar datos relacionados. Cuando agrupas una tabla con el uso de varias columnas, el orden de las columnas que especificas es importante. El orden de las columnas especificadas determina el orden de clasificación de los datos.

A fin de optimizar el rendimiento cuando ejecutas consultas en tablas agrupadas, utiliza una expresión que filtre una columna agrupada o varias columnas agrupadas en el orden en que se especifican las columnas agrupadas. Por lo general, las consultas que filtran las columnas agrupadas funcionan mejor que las consultas que solo filtran las columnas no agrupadas.

BigQuery ordena los datos en una tabla agrupada según los valores de las columnas de agrupamiento y, luego, los organiza en bloques.

Cuando envías una consulta con un filtro en una columna agrupada, BigQuery usa la información de agrupamiento para determinar de manera eficiente si el bloque contiene datos pertinentes a la consulta. Esto permite que BigQuery solo analice los bloques relevantes, proceso conocido como reducción de bloques.

Puedes consultar tablas agrupadas mediante el uso de la IU web de BigQuery, el comando bq query de la herramienta de línea de comandos, o a través de una llamada al método de API jobs.insert y la configuración de un trabajo de consulta.

Actualmente, solo puedes utilizar SQL estándar con las tablas agrupadas.

Permisos necesarios

A fin de consultar una tabla agrupada a nivel del conjunto de datos, se requiere acceso de READER al conjunto de datos que contiene la tabla.

En lugar de usar permisos a nivel del conjunto de datos, puedes aprovechar una función de IAM a nivel del proyecto que incluya permisos bigquery.tables.getData. Los permisos bigquery.tables.getData se necesitan para leer los datos en la tabla que se consulta. Todas las funciones de IAM predefinidas a nivel del proyecto incluyen permisos bigquery.tables.getData, excepto bigquery.user, bigquery.jobUser y bigquery.metadataViewer.

También debes tener permisos bigquery.jobs.create para ejecutar los trabajos de consulta. Las siguientes funciones de IAM predefinidas a nivel del proyecto incluyen los permisos bigquery.jobs.create:

Si deseas obtener más información sobre las funciones de IAM y los permisos en BigQuery, consulta Control de acceso. A fin de obtener más información sobre las funciones a nivel del conjunto de datos, consulta Funciones básicas para conjuntos de datos.

Recomendaciones

Si deseas obtener el mejor rendimiento de las consultas en las tablas agrupadas, utiliza las siguientes recomendaciones.

Tabla de muestra utilizada en los ejemplos

La tabla de muestra utilizada en los ejemplos de esta página es una tabla agrupada en clústeres que se crea mediante el uso de una declaración DDL. La declaración DDL crea una tabla denominada ClusteredSalesData. La tabla se agrupa según las siguientes columnas: primero por customer_id y, a continuación, por product_id y por order_id.

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

Filtra columnas agrupadas en el orden en que se especifican

Cuando especificas un filtro, utiliza expresiones que filtren las columnas agrupadas en el orden de clasificación.

La siguiente consulta incluye una expresión de filtro que filtra según customer_id y, a continuación, por product_id. Esta consulta optimiza el rendimiento; para ello, filtra las columnas agrupadas en el orden de clasificación.

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

La siguiente consulta no filtra las columnas agrupadas en el orden de clasificación. Como resultado, el rendimiento de la consulta no es óptimo. Esta consulta filtra por product_id y, a continuación, por order_id (se omite customer_id).

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

No uses columnas agrupadas en expresiones de filtro complejas

Si utilizas una columna agrupada en una expresión de filtro compleja, el rendimiento de la consulta no se optimiza, porque la reducción de bloques no se puede aplicar.

Por ejemplo, la siguiente consulta no reducirá los bloques porque se utiliza una columna agrupada, customer_id, en una función en la expresión de filtro.

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

A fin de optimizar el rendimiento de la consulta mediante la reducción de bloques, utiliza expresiones de filtro simples, como las siguientes. En este ejemplo, se aplica un filtro simple a la columna agrupada: customer_id.

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

No compares columnas agrupadas con otras columnas

Si una expresión de filtro compara una columna agrupada con otra columna (sea una columna agrupada o no agrupada), el rendimiento de la consulta no se optimiza, porque la reducción de bloques no se puede aplicar.

La siguiente consulta no reduce bloques porque la expresión de filtro compara una columna agrupada, customer_id, con otra columna, order_id.

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

Próximos pasos

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.