Introducción a las tablas particionadas

En esta página, se proporciona una descripción general de las tablas particionadas en BigQuery. Una tabla de partición es una tabla especial que se divide en segmentos, denominados particiones, que facilitan la administración y la consulta de tus datos. Dividir una tabla grande en particiones más pequeñas puede mejorar el rendimiento de la consulta. Además, puedes controlar los costos si reduces la cantidad de bytes que lee una consulta.

Puedes realizar particiones de las tablas de BigQuery de la siguiente manera:

  • Columna de unidad de tiempo: Las tablas se particionan en función de una columna TIMESTAMP, DATE o DATETIME en la tabla.

  • Tiempo de transferencia: Las tablas se particionan en función de la marca de tiempo cuando BigQuery transfiere los datos.

  • Rango de números enteros: las tablas se particionan en función de una columna de números enteros.

Si una consulta usa un filtro apto en el valor de la columna de partición, BigQuery puede analizar las particiones que coinciden con el filtro y omitir las particiones restantes. Este proceso se conoce como reducción.

Partición de columnas por unidad de tiempo

Puedes particionar una tabla en una columna DATE, TIMESTAMP o DATETIME en la tabla. Cuando escribes datos en la tabla, BigQuery coloca los datos en la partición correcta de forma automática, según los valores de la columna.

Para las columnas TIMESTAMP y DATETIME, las particiones pueden tener un nivel de detalle por hora, diario, mensual o anual. Para las columnas DATE, las particiones pueden tener un nivel de detalle diario, mensual o anual. Los límites de partición se basan en la hora UTC.

Por ejemplo, supongamos que particionas una tabla en una columna DATETIME con partición mensual. Si insertas los siguientes valores en la tabla, las filas se escriben en las siguientes particiones:

Valor de columna Partición (mensual)
DATETIME("2019-01-01") 201901
DATETIME("2019-01-15") 201901
DATETIME("2019-04-30") 201904

Además, se crean dos particiones especiales:

  • __NULL__ contiene filas con valores NULL en la columna de partición.
  • __UNPARTITIONED__: Contiene filas en las que el valor de la columna de partición es anterior al 01/01/1960 o posterior al 31/12/2159.

Partición por tiempo de transferencia

Cuando creas una tabla particionada por tiempo de transferencia, BigQuery asigna de forma automática filas a las particiones en función del momento en que BigQuery transfiere los datos. Puedes elegir el nivel de detalle por hora, día, mes o año para las particiones. Los límites de partición se basan en la hora UTC.

Una tabla particionada por tiempo de transferencia tiene una seudocolumna llamada _PARTITIONTIME. El valor de esta columna es el tiempo de transferencia para cada fila, truncado al límite de partición (como por hora o por día). Por ejemplo, supongamos que creas una tabla particionada por tiempo de transferencia con partición por hora y envías datos en los siguientes momentos:

Tiempo de transferencia _PARTITIONTIME Partición (por hora)
2021-05-07 17:22:00 2021-05-07 17:00:00 2021050717
2021-05-07 17:40:00 2021-05-07 17:00:00 2021050717
2021-05-07 18:31:00 2021-05-07 18:00:00 2021050718

Debido a que en la tabla de este ejemplo se usa la partición por hora, el valor de _PARTITIONTIME se trunca a un límite de hora. BigQuery usa este valor a fin de determinar la partición correcta para los datos.

También puedes escribir datos en una partición específica. Por ejemplo, es posible que desees cargar datos históricos o ajustarlos para zonas horarias. Puedes usar cualquier fecha válida entre el 01/01/0001 y el 31/12/9999. Sin embargo, las declaraciones DML no pueden hacer referencia a fechas anteriores al 01/01/1970 o posteriores al 31/12/2159. Para obtener más información, consulta Escribe datos en una partición específica.

En lugar de _PARTITIONTIME, también puedes usar _PARTITIONDATE. La seudocolumna _PARTITIONDATE contiene la fecha UTC correspondiente al valor de la seudocolumna _PARTITIONTIME.

Partición por rangos de números enteros

Puedes particionar una tabla en función de rangos de valores en una columna INTEGER específica. Para crear una tabla particionada por rangos de números enteros, debes proporcionar lo siguiente:

  • La columna de partición
  • El valor inicial para la partición de rangos (inclusivo)
  • El valor final para la partición de rangos (exclusivo)
  • El intervalo de cada rango dentro de la partición

Por ejemplo, supongamos que creas una partición por rangos de números enteros con la siguiente especificación:

Argumento Valor
nombre de la columna customer_id
start 0
finalización 100
intervalo 10

La tabla está particionada en la columna customer_id en rangos de intervalo 10. Los valores del 0 al 9 van a una partición, los valores del 10 al 19 van a la siguiente partición, etc., hasta 99. Los valores fuera de este rango van a una partición llamada __UNPARTITIONED__. Cualquier fila en la que customer_id sea NULL van a una partición llamada __NULL__.

Elige particiones diarias, por hora, mensuales o anuales.

Cuando particionas una tabla por columna de unidad de tiempo o tiempo de transferencia, eliges si las particiones tienen un nivel de detalle por día, hora, mes o año.

  • La partición diaria es el tipo de partición predeterminado. La partición diaria es una buena opción cuando tus datos se distribuyen en un amplio rango de fechas o si se agregan de forma continua en el tiempo.

  • Elige la partición por hora si las tablas tienen un gran volumen de datos que abarca un período corto (por lo general, menos de seis meses de valores de marca de tiempo). Si eliges la partición por hora, asegúrate de que el recuento de particiones permanezca dentro de los límites de partición.

  • Elige la partición mensual o anual si tus tablas tienen una cantidad de datos relativamente pequeña por cada día, pero abarcan un período amplio. Esta opción también se recomienda si el flujo de trabajo requiere actualizar o agregar con frecuencia filas que abarquen un período amplio (por ejemplo, más de 500 fechas). En estas situaciones, usa la partición mensual o anual junto con el agrupamiento en clústeres en la columna de partición para lograr el mejor rendimiento. Para obtener más información, consulta Partición en comparación con agrupamiento en clústeres en esta página.

Partición en comparación con agrupamiento en clústeres

Tanto la partición como el agrupamiento en clústeres pueden mejorar el rendimiento y reducir el costo de la consulta.

Usa el agrupamiento en clústeres en las siguientes circunstancias:

  • Cuando no necesites garantías de costos estrictas antes de ejecutar la consulta.
  • Cuando necesites un nivel de detalle mayor que el que permite la partición. Si quieres obtener beneficios de agrupamiento en clústeres, además de los beneficios de la partición, puedes usar la misma columna para la partición y el agrupamiento en clústeres.
  • Por lo general, tus consultas usan filtros o agregación en varias columnas en particular.
  • La cardinalidad del número de valores en una columna o grupo de columnas es grande.

Usa la partición en las siguientes circunstancias:

  • Deseas conocer los costos de consulta antes de que esta se ejecute. La reducción de la partición se realiza antes de que se ejecute la búsqueda, por lo que puedes obtener el costo de la búsqueda después de reducir la partición a través de una ejecución de prueba. La reducción del clúster se realiza cuando se ejecuta la búsqueda, por lo que el costo se conocerá una vez que finalice la búsqueda.

  • Cuando necesites administración a nivel de partición. Por ejemplo, deseas establecer un tiempo de vencimiento de la partición, cargar datos en una partición específica o borrar particiones.

  • Deseas especificar cómo se particionan los datos y qué datos hay en cada partición. Por ejemplo, deseas definir el nivel de detalle del tiempo o definir los rangos usados para particionar la tabla en la partición por rango de números enteros.

Usa el agrupamiento en clústeres en partición en las siguientes circunstancias:

  • La partición da como resultado una pequeña cantidad de datos por partición (aproximadamente menos de 1 GB).
  • La partición genera una gran cantidad de particiones más allá de los límites de las tablas particionadas.
  • Realizar particiones en tus operaciones de mutación modifica la mayoría de las particiones de la tabla con frecuencia (por ejemplo, cada pocos minutos)

También puedes combinar la partición con el agrupamiento en clústeres. Primero, se particionan los datos y, luego, los datos de cada partición se agrupan en las columnas de agrupamiento en clústeres.

Cuando se consulta la tabla, la partición establece un límite superior para el costo de la búsqueda en función de la reducción de la partición. Puede haber otros ahorros en el costo de la búsqueda cuando esta realmente se ejecuta debido a la reducción del clúster.

Partición en comparación con fragmentación

La fragmentación de tablas es la práctica de almacenar datos en varias tablas mediante un prefijo de nombres, como [PREFIX]_YYYYMMDD.

Se recomienda realizar particiones en lugar de fragmentación de tabla, puesto que las tablas particionadas tienen un mejor rendimiento. Con las tablas fragmentadas, BigQuery debe mantener una copia del esquema y los metadatos para cada tabla. BigQuery también podría verificar los permisos para cada tabla consultada. Esta práctica también aumenta la sobrecarga de la búsqueda y afecta su rendimiento.

Si ya creaste tablas fragmentadas por fecha, puedes convertirlas en una tabla particionada por tiempo de transferencia. Para obtener más información, consulta la sección sobre cómo convertir tablas fragmentadas por fecha en tablas particionadas por tiempo de transferencia.

Limitaciones

No puedes usar SQL heredado para consultar tablas particionadas o escribir resultados de consultas en ellas.

Las tablas particionadas por columnas de unidad de tiempo están sujetas a las siguientes limitaciones:

  • La columna de partición debe consistir en una columna escalar de DATE, TIMESTAMP o DATETIME. El modo de la columna puede ser REQUIRED o NULLABLE, pero no REPEATED (basada en arreglo).
  • La columna de partición debe ser un campo de nivel superior. No puedes usar un campo de hoja de un RECORD (STRUCT) como columna de partición.

Las tablas particionadas por rango de números enteros están sujetas a las siguientes limitaciones:

  • La columna de partición debe ser una columna INTEGER. El modo de la columna puede ser REQUIRED o NULLABLE, pero no puede ser REPEATED (basada en arreglo).
  • La columna de partición debe ser un campo de nivel superior. No puedes usar un campo de hoja de un RECORD (STRUCT) como columna de partición.

Cuotas y límites de tablas de partición

Las tablas particionadas definieron límites en BigQuery.

Las cuotas y los límites se aplican a los diferentes tipos de trabajos que puedes ejecutar en las tablas de partición, incluidos los siguientes:

Para obtener más información sobre todas las cuotas y límites, consulta Cuotas y límites.

Precios de tablas de partición

Cuando creas y usas tablas de partición en BigQuery, el cobro se basa en la cantidad de datos almacenados en las particiones y en las consultas que ejecutas en ellos.

Muchas operaciones en tablas de partición son gratuitas, como subir datos a particiones, copiarlas y exportar datos desde ellas. A pesar de esto, estas operaciones están sujetas a las Cuotas y límites de BigQuery. Para obtener información sobre todas las operaciones gratuitas, consulta Operaciones gratuitas en la página de precios.

Si deseas conocer las prácticas recomendadas para controlar los costos en BigQuery, consulta Controla costos en BigQuery.

Seguridad de la tabla particionada

El control de acceso para las tablas particionadas es el mismo que el de las tablas estándar. Para obtener más información, consulta Introducción a los controles de acceso a tablas.

¿Qué sigue?