Consultas federadas de Spanner

Como analista de datos, puedes consultar datos en Spanner desde BigQuery mediante consultas federadas.

La federación de BigQuery Spanner permite que BigQuery consulte datos que se encuentran en Spanner en tiempo real, sin copiarlos ni moverlos.

Puedes consultar los datos de Spanner de dos maneras:

  • Crea un conjunto de datos externo de Spanner.
  • Usa una 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 deGoogle Cloud , incluidas las instancias y las bases de datos de Spanner. Determinan qué principales pueden acceder al servicio de Spanner y realizar acciones a nivel de la instancia o 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 de Google Cloud CLI. Algunos ejemplos son roles/bigquery.connectionUser y roles/spanner.databaseReader. Para obtener más información, consulta Roles de IAM de Spanner y cómo otorgar permisos.

  • Roles de base de datos de Spanner: Estos roles se definen dentro de una base de datos de Spanner con instrucciones 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 los permisos dentro de la base de datos.

Cómo determinar si eres usuario de FGAC

Para determinar los permisos correctos que debes solicitar, primero debes saber si eres 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 usuario del 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 es así, debes conocer los nombres de los roles de la 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 es necesario que uses un rol de base de datos específico cuando te conectes.

Comparación de la aplicación de roles

Si bien IAM controla el acceso al recurso de la base de datos en sí, los roles de base de datos de Spanner controlan los permisos para 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 spanner.databases.useRoleBasedAccess de IAM, que a menudo se otorga 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 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, tus tablas de la base de datos de Spanner correspondiente serán visibles en BigQuery y podrás usarlas en tus consultas, por ejemplo, en uniones, uniones o subconsultas. Sin embargo, no se transfieren datos del almacenamiento de Spanner al de BigQuery.

No es necesario que crees una conexión para consultar los 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 a fin de consultar una instancia de Spanner, pídele al administrador que te otorgue el rol de usuario de conexión de BigQuery (roles/bigquery.connectionUser) de IAM en la conexión. También necesitas los permisos adecuados en la base de datos de Spanner, que dependen de si eres usuario de FGAC.
    • Si eres usuario del control de acceso detallado, haz lo siguiente:
      • Necesitas los roles de IAM requeridos 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 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 hacen referencia tus consultas. El administrador de la base de datos otorga privilegios con la instrucción DDL GRANT (o el equivalente de PostgreSQL).
    • Si no eres un usuario del 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 base de datos forma parte de la configuración de FGAC dentro de la base de datos de Spanner, y es 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 DataBoost (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 los usuarios que no utilizan el FGAC o los permisos de control de acceso detallado adecuados.

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

Habilita Data Boost

Cuando se usan conjuntos de datos externos, siempre se usa Data Boost y no es necesario habilitarlo de forma manual.

Si deseas usar Data Boost para tus consultas de EXTERNAL_QUERY, debes habilitarlo cuando crees una conexión que use 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 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 prioridad (high, medium o low) a las consultas individuales si especificas 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 búsquedas con una prioridad de high compiten con el tráfico transaccional. Las búsquedas con prioridad low son el mejor esfuerzo y pueden interrumpirse mediante 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 se verán directamente en BigQuery Studio y podrás 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 la transferencia de datos de Spanner. Para obtener más información, consulta Precios de Spanner.

Se te cobra por la transferencia de datos según los siguientes SKUs:

  • Transferencia de datos externa entre zonas dentro de la región de red
  • Transferencia de datos de red entre regiones hacia el mismo continente
  • Transferencia de datos de red entre regiones a 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 tiene réplicas de lectura y escritura o de solo lectura.

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

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

Por ejemplo:

  • BigQuery (US multirregión) y Spanner (us-central1): Se aplican costos por la transferencia de datos dentro de la misma región.
  • BigQuery (US multirregión) 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?