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.

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 Identity and Access Management (IAM). También debes pedirle al administrador que te otorgue uno de los siguientes elementos:
    • Si eres un usuario del control de acceso detallado, necesitas acceso a un rol de base de datos que tenga el privilegio SELECT en todos los objetos del esquema de Spanner en tus consultas.
    • Si no eres un usuario de control de acceso detallado, necesitas el rol de IAM de lector de base de datos de Cloud Spanner (roles/spanner.databaseReader).

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

Elige la conexión correcta

Si eres un usuario del control de acceso detallado de Spanner, cuando ejecutes una consulta federada, debes usar una conexión de Spanner que especifique un rol de base de datos. Luego, todas las consultas que ejecutes con esta conexión usarán 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.

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 impacto casi nulo 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 tiene un mayor impacto 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 administrador de bases de datos de Cloud Spanner (roles/spanner.databaseAdmin) en la base de datos de Spanner. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.

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.

Habilita Data Boost

Para habilitar Data Boost en tus consultas federadas a Spanner, primero debes establecer una conexión a Spanner. Después de habilitar Data Boost en la conexión, consulta los datos para enviar una consulta federada a Spanner.

Consultar 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 Cloud 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;

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, consulta Lee datos en paralelo en la documentación de Spanner.

Para habilitar las lecturas paralelas en las consultas federadas, establece esta configuración cuando crees el recurso de conexión. Esta opción divide la consulta de SQL en particiones más pequeñas y recupera cada partición en paralelo. Sin embargo, esta opción está restringida a consultas que cumplan con una de las siguientes condiciones:

Otras consultas muestran un error. A fin de ver el plan de ejecución de consultas para una consulta de Spanner, revisa Comprende cómo Spanner ejecuta consultas.

Administra la prioridad de ejecución de las consultas

Puedes asignar la prioridad (high, medium o low) a las consultas individuales si especificas la opción query_execution_priority, como se muestra a continuación:

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 competirán 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.

Ve un esquema de tabla de Spanner

Puedes usar la función EXTERNAL_QUERY para consultar vistas information_schema a fin de acceder a los metadatos de la base de datos, como listas de todas las tablas en la base de datos o la visualización de un esquema de tabla. 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:

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?