Consultas federadas de Spanner

Las consultas federadas en BigQuery te permiten consultar datos que se encuentran en Spanner en tiempo real sin copiarlos ni moverlos. Puedes consultar datos de Spanner creando un conjunto de datos externo de Spanner o usando la función EXTERNAL_QUERY.

Comprende los roles y permisos

Cuando consultas Spanner desde BigQuery, encuentras dos tipos distintos de roles que administran el acceso en diferentes niveles.

  • Roles de IAM: Estos roles rigen el acceso a los recursos de Google Cloud , incluidas las instancias y bases de datos de Spanner. Determinan qué principales pueden acceder al servicio de Spanner y realizar acciones a nivel de la instancia o de la base de datos, como conectarse, leer datos o administrar. Administras los roles de Identity and Access Management (IAM) a través de la consola de IAM o Google Cloud CLI. Entre los ejemplos, se incluyen roles/bigquery.connectionUser y roles/spanner.databaseReader. Para obtener más información, consulta Roles de IAM de Spanner y Otorga permisos.

  • Roles de base de datos de Spanner: Estos roles se definen dentro de una base de datos de Spanner con sentencias de DDL, como CREATE ROLE y GRANT. Controlan el acceso detallado a objetos de esquema específicos, como tablas, columnas y vistas, dentro de la base de datos. Esto forma parte del control de acceso detallado (FGAC). Usas un rol de base de datos si tu organización implementa FGAC para administrar permisos dentro de la base de datos.

Determina si eres un usuario de FGAC

Para determinar los permisos correctos que debes solicitar, debes determinar si eres un usuario de FGAC. Para ello, pregúntale al administrador de la base de datos de Spanner si tu acceso a la base de datos de Spanner se administra a través del control de acceso detallado.

Es probable que seas un usuario de FGAC si tu administrador otorga permisos a tu cuenta asignándola a un rol de base de datos de Spanner específico (por ejemplo, otorgando a tu cuenta el rol de IAM roles/spanner.databaseRoleUser en un recurso de rol de base de datos). Si este es el caso, debes conocer el nombre de los roles de base de datos que puedes usar. Debes configurar la conexión de BigQuery para usar uno de estos roles de base de datos.

Es probable que no seas un usuario de FGAC si tu administrador otorga a tu cuenta roles de IAM más amplios a nivel de la base de datos, como roles/spanner.databaseReader. En este caso, no necesitas usar un rol de base de datos específico cuando te conectas.

Compara la aplicación de roles

Aunque IAM controla el acceso al recurso de la base de datos, los roles de la base de datos de Spanner controlan los permisos de los objetos dentro de esa base de datos.

Para usar un rol de base de datos de FGAC, por lo general, necesitas los siguientes permisos:

  • El permiso de IAM spanner.databases.useRoleBasedAccess, que suele otorgarse a través del rol roles/spanner.fineGrainedAccessUser.
  • Permiso para usar el rol de base de datos específico, que se otorga a través del rol roles/spanner.databaseRoleUser con una condición de IAM.

Para obtener más información sobre cómo configurar estos permisos, consulta Configura el FGAC.

Usa conjuntos de datos externos

La forma más sencilla de consultar tablas de Spanner es crear un conjunto de datos externo. Después de crear el conjunto de datos externo, las tablas de la base de datos de Spanner correspondiente se podrán ver en BigQuery y podrás usarlas en tus consultas, por ejemplo, en uniones o subconsultas. Sin embargo, no se mueven datos de Spanner al almacenamiento de BigQuery.

No es necesario que crees una conexión para consultar datos de Spanner si creas un conjunto de datos externo.

Usa la función EXTERNAL_QUERY

Al igual que con otras bases de datos federadas, también puedes consultar datos de Spanner con una función EXTERNAL_QUERY. Esto puede ser útil si deseas tener más control sobre los parámetros de conexión.

Antes de comenzar

  • Asegúrate de que el administrador de BigQuery haya creado una conexión de Spanner y la haya compartido contigo. Consulta Elige la conexión correcta.
  • Para obtener los permisos que necesitas para consultar una instancia de Spanner, pídele al administrador que te otorgue el rol de IAM de usuario de conexión de BigQuery (roles/bigquery.connectionUser) en la conexión. También necesitas los permisos adecuados en la base de datos de Spanner, que dependen de si eres un usuario de FGAC.
    • Si eres un usuario del control de acceso detallado, haz lo siguiente:
      • Necesitas los roles de IAM necesarios para usar FGAC. Por lo general, estos roles son roles/spanner.fineGrainedAccessUser y roles/spanner.databaseRoleUser. Los roles se usan con una condición que especifica el rol de la base de datos.
      • El rol de la base de datos de Spanner que especifiques en la conexión debe tener el privilegio SELECT en todos los objetos de esquema a los que hagan referencia tus consultas. El administrador de la base de datos otorga privilegios con la sentencia de DDL GRANT (o el equivalente de PostgreSQL).
    • Si no eres un usuario de control de acceso detallado, necesitas el rol de IAM de lector de base de datos de Spanner (roles/spanner.databaseReader) en la base de datos.

    Para obtener información sobre cómo otorgar roles de IAM, consulta Administración del acceso a proyectos, carpetas y organizaciones.

Elige la conexión correcta

Si eres un usuario del control de acceso detallado de Spanner, cuando ejecutes una consulta federada con una función EXTERNAL_QUERY, debes usar una conexión de Spanner que especifique un rol de base de datos. Este rol de la base de datos forma parte de la configuración del FGAC dentro de la base de datos de Spanner, independiente de tus roles de IAM. Luego, todas las consultas que ejecutes con esta conexión usarán los permisos otorgados a ese rol de base de datos.

Si usas una conexión que no especifica un rol de base de datos, debes tener los roles de IAM indicados en Antes de comenzar.

Consulta los datos

Para enviar una consulta federada a Spanner desde una consulta de GoogleSQL, usa la función EXTERNAL_QUERY.

Formula tu consulta de Spanner en GoogleSQL o PostgreSQL, según el dialecto especificado de la base de datos.

En el siguiente ejemplo, se realiza una consulta federada a una base de datos de Spanner llamada orders y se unen los resultados con una tabla de BigQuery llamada mydataset.customers:

SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq
  ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

Data Boost de Spanner

Data Boost es una función sin servidores y completamente administrada que proporciona recursos de procesamiento independientes para las cargas de trabajo de Spanner compatibles. Data Boost te permite ejecutar consultas de estadísticas y exportaciones de datos con un efecto mínimo en las cargas de trabajo existentes de la instancia de Spanner aprovisionada. Data Boost te permite ejecutar consultas federadas con capacidad de procesamiento independiente separada de tus instancias aprovisionadas para evitar afectar las cargas de trabajo existentes en Spanner. Data Boost es más útil cuando ejecutas consultas ad hoc complejas o cuando deseas procesar grandes cantidades de datos sin afectar la carga de trabajo existente de Spanner. Ejecutar consultas federadas con Data Boost puede reducir el consumo de CPU de forma significativa y, en algunos casos, lograr una latencia de consulta más baja.

Antes de comenzar

Para obtener el permiso que necesitas para habilitar el acceso a Data Boost, pídele a tu administrador que te otorgue el rol de IAM de Lector de bases de datos de Cloud Spanner con Data Boost (roles/spanner.databaseReaderWithDataBoost) en la base de datos de Spanner. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene el permiso spanner.databases.useDataBoost, que se requiere para habilitar el acceso a Data Boost.

También puedes obtener este permiso con roles personalizados o con otros roles predefinidos.

El rol de IAM roles/spanner.databaseReaderWithDataBoost otorga permiso para usar Data Boost. Este rol es obligatorio, además de los permisos básicos necesarios para leer datos, como roles/spanner.databaseReader para usuarios que no tienen FGAC o los permisos de control de acceso detallado adecuados.

El uso de conjuntos de datos externos con Spanner siempre usa Data Boost y, por lo tanto, requiere el permiso spanner.databases.useDataBoost.

Habilita Data Boost

Cuando usas conjuntos de datos externos, siempre se usa Data Boost y no tienes que habilitarlo de forma manual.

Si quieres usar Data Boost para tus consultas de EXTERNAL_QUERY, debes habilitarlo cuando creas una conexión que usa tu consulta.

Leer datos en paralelo

Spanner puede dividir determinadas consultas en partes más pequeñas, o particiones, y recuperar las particiones en paralelo. Para obtener más información, incluida una lista de limitaciones, consulta Lee datos en paralelo en la documentación de Spanner.

Para ver el plan de ejecución de consultas para una consulta de Spanner, consulta Comprende cómo Spanner ejecuta consultas.

Cuando se ejecutan consultas federadas con conjuntos de datos externos, siempre se usa la opción "Leer datos en paralelo".

Para habilitar las lecturas paralelas cuando usas el EXTERNAL_QUERY, habilítalas cuando crees la conexión.

Administra la prioridad de ejecución de las consultas

Cuando ejecutas consultas federadas con una función EXTERNAL_QUERY, puedes asignar la prioridad (high, medium o low) a las consultas individuales especificando la opción query_execution_priority:

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''',
  '{"query_execution_priority":"high"}');

La prioridad predeterminada es medium.

Las consultas con una prioridad de high compiten con el tráfico transaccional. Las consultas con prioridad low son el mejor esfuerzo y pueden interrumpirse por la carga en segundo plano, por ejemplo, las copias de seguridad programadas.

Cuando se ejecutan consultas federadas con conjuntos de datos externos, todas las consultas siempre tienen prioridad medium.

Ve un esquema de tabla de Spanner

Si usas conjuntos de datos externos, tus tablas de Spanner son visibles directamente en BigQuery Studio y puedes ver sus esquemas.

Sin embargo, también puedes ver los esquemas sin definir conjuntos de datos externos. También puedes usar la función EXTERNAL_QUERY para consultar las vistas information_schema y acceder a los metadatos de la base de datos. En el siguiente ejemplo, se muestra información sobre las columnas de la tabla MyTable:

Base de datos de Google SQL

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT t.column_name, t.spanner_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_catalog = ''
      AND t.table_schema = ''
     AND t.table_name = 'MyTable'
    ORDER BY t.ordinal_position
  ''');

Base de datos de PostgreSQL

SELECT * from EXTERNAL_QUERY(
'my-project.us.postgresql-example-db',
'''SELECT t.column_name, t.data_type, t.is_nullable
   FROM information_schema.columns AS t
   WHERE t.table_schema = 'public' AND t.table_name = 'MyTable'
   ORDER BY t.ordinal_position''');

Para obtener más información, consulta las siguientes referencias del esquema de información en la documentación de Spanner:

Precios

Consultas entre regiones

BigQuery admite consultas federadas en las que las instancias de Spanner y los conjuntos de datos de BigQuery se encuentran en regiones diferentes. Estas consultas generan un cargo adicional por transferencia de datos de Spanner. Para obtener más información, consulta Precios de Spanner.

Se te cobrará por la transferencia de datos según los siguientes SKU:

  • Transferencia de datos de red externa entre zonas dentro de una región
  • Transferencia de datos de red entre regiones hacia el mismo continente
  • Transferencia de datos de red entre regiones hacia un continente diferente

La transferencia de datos se cobra según la región de BigQuery en la que ejecutas la consulta y la región de Spanner más cercana que tenga réplicas de lectura y escritura o de solo lectura.

Para las configuraciones multirregionales de BigQuery (US o EU), los costos de transferencia de datos desde Spanner se determinan de la siguiente manera:

  • Multirregión US de BigQuery: región us-central1 de Spanner
  • Multirregión EU de BigQuery: región europe-west1 de Spanner

Por ejemplo:

  • BigQuery (multirregión US) y Spanner (us-central1): Se aplican costos por la transferencia de datos dentro de la misma región.
  • BigQuery (multirregión US) y Spanner (us-west4): Se aplican costos por la transferencia de datos entre regiones dentro del mismo continente.

Soluciona problemas

En esta sección, se proporciona ayuda para solucionar los problemas que puedes encontrar cuando envías una consulta federada a Spanner.

Problema: La consulta no se puede particionar de raíz.
Resolución: Si configuras la conexión para leer datos en paralelo, el primer operador en el plan de ejecución de consultas debe ser una unión distribuida o tu plan de ejecución no debe tener uniones distribuidas. Para resolver este error, visualiza el plan de ejecución de consultas y reescribe la consulta. Para obtener más información, consulta Comprende cómo Spanner ejecuta consultas.
Problema: Se superó el plazo.
Resolución: Selecciona la opción para leer datos en paralelo y reescribe la consulta para que pueda particionarse desde la raíz. Para obtener más información, consulta Comprende cómo Spanner ejecuta consultas.

¿Qué sigue?