Consulta 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 usan para colocar datos relacionados. Cuando agrupas una tabla en clústeres a través de varias columnas, el orden de las columnas que especifiques 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 eficaz 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.
Para consultar tablas agrupadas en clústeres, puedes realizar las siguientes acciones:
- Usa Cloud Console.
- Usar el comando
bq query
de la herramienta de línea de comandos debq
- Con una llamada al método jobs.insert de la API y la configuración de un trabajo de consulta
- Mediante las bibliotecas cliente
Actualmente, solo puedes utilizar SQL estándar con las tablas agrupadas.
Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de BigQuery.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Python
Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la Guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.
Permisos necesarios
Como mínimo, para consultar una tabla, debes tener los permisos bigquery.tables.getData
.
Las siguientes funciones predefinidas de IAM incluyen los permisos bigquery.tables.getData
:
bigquery.dataViewer
bigquery.dataOwner
bigquery.dataEditor
bigquery.admin
Además, si un usuario tiene permisos bigquery.datasets.create
, se le otorga el acceso bigquery.dataOwner
cuando crea un conjunto de datos.
El acceso a bigquery.dataOwner
permite al usuario consultar tablas y vistas del conjunto de datos.
También debes tener permisos bigquery.jobs.create
si quieres ejecutar trabajos de consulta.
Las siguientes funciones predefinidas de IAM incluyen los permisos bigquery.jobs.create
:
bigquery.user
bigquery.jobUser
bigquery.admin
Para obtener más información sobre las funciones y permisos de IAM en BigQuery, consulta Control de acceso.
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 usada 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 instrucción DDL crea una tabla llamada ClusteredSalesData
. La tabla está agrupada según las siguientes columnas: customer_id
, product_id
, order_id
, en ese orden de clasificación.
CREATE TABLE `mydataset.ClusteredSalesData` PARTITION BY DATE(timestamp) CLUSTER BY customer_id, product_id, order_id AS SELECT * FROM `mydataset.SalesData`
Filtra columnas agrupadas según el orden de clasificación
Cuando especifiques un filtro, usa expresiones que filtren las columnas agrupadas en el orden de clasificación. Para obtener los beneficios del agrupamiento en clústeres, incluye todas las columnas agrupadas o un subconjunto de las columnas en orden de izquierda a derecha, comenzando con la primera columna. Por ejemplo, si el orden de la columna es A
, B
, C
, una consulta que filtre en A
y B
podría beneficiarse del agrupamiento en clústeres, no así una consulta que filtre en B
yC
. El orden de los nombres de columna dentro de la expresión de filtro no afecta el rendimiento.
La siguiente consulta incluye una expresión de filtro que filtra por customer_id
y, luego, 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, luego, 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 usas 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 recortará bloques porque una columna agrupada en clústeres (customer_id
) está en uso 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, usa expresiones de filtro simples, como las siguientes. En este ejemplo, se aplica un filtro simple a la columna agrupada en clústeres: 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 recorta los bloques porque la expresión de filtro compara una columna agrupada en clústeres (customer_id
) con otra columna (order_id
).
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = order_id
Próximos pasos
- Para obtener más información sobre cómo ejecutar consultas, revisa Ejecuta consultas interactivas y por lotes.
- Para aprender a crear y utilizar tablas agrupadas en clústeres, consulta Crea y usa tablas agrupadas.
- Para obtener una descripción general de la compatibilidad con tablas particionadas en BigQuery, consulta Introducción a las tablas particionadas.
- Para aprender cómo crear y usar tablas particionadas por tiempo de transferencia, consulta Crea y usa tablas particionadas por tiempo de transferencia.
- Para aprender a crear y usar tablas particionadas, consulta Cómo crear y usar tablas particionadas.