Query federate di Spanner

In qualità di analista di dati, puoi eseguire query sui dati in Spanner da BigQuery utilizzando query federate.

La federazione di BigQuery Spanner consente a BigQuery di eseguire query sui dati che risiedono in Spanner in tempo reale, senza copiare o spostare dati.

Prima di iniziare

  • Assicurati che l'amministratore BigQuery abbia creato una connessione Spanner e l'abbia condivisa con te. Consulta la sezione Scegliere la connessione giusta.
  • Per ottenere le autorizzazioni necessarie per eseguire query su un'istanza Spanner, chiedi all'amministratore di concederti il ruolo Utente connessione BigQuery (roles/bigquery.connectionUser) Identity and Access Management (IAM). Devi inoltre chiedere all'amministratore di concederti una delle seguenti autorizzazioni:
    • Se sei un utente controllo dell'accesso granulare, devi avere accesso a un ruolo di database con il privilegio SELECT su tutti gli oggetti schema di Spanner nelle tue query.
    • Se non sei un utente controllo dell'accesso granulare, devi disporre del ruolo IAM Lettore database Cloud Spanner (roles/spanner.databaseReader).

    Per informazioni sulla concessione dei ruoli IAM, consulta Gestire l'accesso a progetti, cartelle e organizzazioni. Per informazioni sul controllo dell'accesso granulare, consulta Informazioni sul controllo dell'accesso granulare.

Scegli la connessione giusta

Se sei un utente controllo dell'accesso granulare di Spanner, quando esegui una query federata, devi utilizzare una connessione Spanner che specifichi un ruolo del database. Quindi tutte le query eseguite con questa connessione utilizzeranno quel ruolo di database.

Se utilizzi una connessione che non specifica un ruolo del database, devi disporre dei ruoli IAM indicati in Prima di iniziare.

Data Boost di Spanner

Data Boost è una funzionalità serverless completamente gestita che fornisce risorse di computing indipendenti per i carichi di lavoro Spanner supportati. Data Boost consente di eseguire query di analisi ed esportazioni di dati con un impatto prossimo allo zero sui carichi di lavoro esistenti sull'istanza di Spanner di cui è stato eseguito il provisioning. Data Boost consente di eseguire query federate con capacità di calcolo indipendente dalle istanze di cui è stato eseguito il provisioning, per evitare di influire sui carichi di lavoro esistenti su Spanner. Data Boost ha l'impatto maggiore quando esegui query ad hoc complesse o quando vuoi elaborare grandi quantità di dati senza influire sul carico di lavoro esistente di Spanner. L'esecuzione di query federate con Data Boost può portare a un consumo della CPU notevolmente inferiore e, in alcuni casi, a una latenza delle query inferiore.

Prima di iniziare

Per ottenere l'autorizzazione necessaria per abilitare l'accesso a Data Boost, chiedi all'amministratore di concederti il ruolo IAM Amministratore database Cloud Spanner (roles/spanner.databaseAdmin) per il database Spanner. Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Questo ruolo predefinito contiene l'autorizzazione spanner.databases.useDataBoost, necessaria per abilitare l'accesso a Data Boost.

Potresti anche essere in grado di ottenere questa autorizzazione con i ruoli personalizzati o altri ruoli predefiniti.

Abilita Data Boost

Per abilitare Data Boost sulle query federate in Spanner, devi prima stabilire una connessione a Spanner. Dopo aver abilitato Data Boost all'interno della connessione, esegui una query sui dati per inviare una query federata a Spanner.

Query sui dati

Per inviare una query federata a Spanner da una query GoogleSQL, utilizza la funzione EXTERNAL_QUERY.

Formula la tua query Spanner in GoogleSQL o PostgreSQL, a seconda del dialetto specificato del database.

L'esempio seguente crea una query federata a un database Spanner denominato orders e unisce i risultati a una tabella BigQuery denominata 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;

Lettura di dati in parallelo

Spanner può suddividere determinate query in parti più piccole, o in partizioni, e recuperare le partizioni in parallelo. Per maggiori informazioni, consulta Leggere i dati in parallelo nella documentazione di Spanner.

Per abilitare le letture parallele nelle query federate, configura questa impostazione quando crei la risorsa di connessione. Questa opzione divide la query SQL in partizioni più piccole e recupera ogni partizione in parallelo. Tuttavia, questa opzione è limitata alle query che soddisfano una delle seguenti condizioni:

Le altre query restituiscono un errore. Per visualizzare il piano di esecuzione di una query di Spanner, consulta Informazioni su come Spanner esegue le query.

Gestisci la priorità di esecuzione delle query

Puoi assegnare la priorità (high, medium o low) alle singole query, specificando l'opzione query_execution_priority, come mostrato di seguito:

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 priorità predefinita è medium.

Le query con priorità high competeranno con il traffico transazionale. Le query con priorità low sono il criterio del "best effort" e potrebbero essere prerilasciate dal carico in background, ad esempio i backup pianificati.

Visualizza uno schema di tabella Spanner

Puoi utilizzare la funzione EXTERNAL_QUERY per eseguire query sulle viste information_schema e accedere ai metadati del database, ad esempio elencando tutte le tabelle nel database o mostrando uno schema di tabella. L'esempio seguente restituisce informazioni sulle colonne della tabella MyTable:

Database SQL di Google

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
  ''');

Database 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
  ''');

Per maggiori informazioni, consulta i seguenti riferimenti allo schema di informazioni nella documentazione di Spanner:

Risoluzione dei problemi

Questa sezione ti aiuta a risolvere i problemi che potresti riscontrare durante l'invio di una query federata a Spanner.

Problema: la query non è partizionabile come root.
Risoluzione: se configuri la connessione in modo da leggere i dati in parallelo, il primo operatore nel piano di esecuzione delle query deve essere un'unione distribuita oppure il piano di esecuzione non deve avere unioni distribuite. Per risolvere questo errore, visualizza il piano di esecuzione della query e riscrivi la query. Per saperne di più, consulta Comprendere in che modo Spanner esegue le query.
Problema: scadenza superata.
Risoluzione: seleziona l'opzione per leggere i dati in parallelo e riscrivere la query in modo che sia partizionabile alla radice. Per maggiori informazioni, consulta Comprendere in che modo Spanner esegue le query.

Passaggi successivi