Query federate di Spanner

Le query federate in BigQuery ti consentono di eseguire query sui dati che risiedono in Spanner in tempo reale senza copiarli o spostarli. Puoi eseguire query sui dati di Spanner creando un set di dati esterno di Spanner o utilizzando la funzione EXTERNAL_QUERY.

Informazioni su ruoli e autorizzazioni

Quando esegui query su Spanner da BigQuery, incontri due tipi distinti di ruoli che gestiscono l'accesso a livelli diversi.

  • Ruoli IAM: questi ruoli regolano l'accesso alle risorseGoogle Cloud , incluse le istanze e i database Spanner. Determinano quali entità possono accedere al servizio Spanner ed eseguire azioni a livello di istanza o database, ad esempio connessione, lettura dei dati o amministrazione. Puoi gestire i ruoli di Identity and Access Management (IAM) tramite la console IAM o Google Cloud CLI. Alcuni esempi sono roles/bigquery.connectionUser e roles/spanner.databaseReader. Per saperne di più, consulta Ruoli IAM di Spanner e Concessione delle autorizzazioni.

  • Ruoli database di Spanner: questi ruoli sono definiti all'interno di un database Spanner utilizzando istruzioni DDL come CREATE ROLE e GRANT. Controllano l'accesso granulare a oggetti di schema specifici, come tabelle, colonne e viste, all'interno del database. Questo fa parte del controllo granulare dell'accesso (FGAC). Utilizzi un ruolo del database se la tua organizzazione implementa FGAC per gestire le autorizzazioni all'interno del database.

Determina se sei un utente FGAC

Per determinare le autorizzazioni corrette da richiedere, devi stabilire se sei un utente FGAC. Per farlo, chiedi all'amministratore del database Spanner se il tuo accesso al database Spanner è gestito tramite controllo dell'accesso granulare dell'accesso.

Se l'amministratore concede le autorizzazioni al tuo account assegnandolo a un ruolo del database Spanner specifico (ad esempio, concedendo al tuo account il ruolo IAM roles/spanner.databaseRoleUser su una risorsa del ruolo del database), probabilmente sei un utente FGAC. In questo caso, devi conoscere il nome dei ruoli del database che puoi utilizzare. Devi configurare la connessione BigQuery in modo che utilizzi uno di questi ruoli del database.

È probabile che tu non sia un utente FGAC se l'amministratore concede al tuo account ruoli IAM più ampi a livello di database, ad esempio roles/spanner.databaseReader. In questo caso, non è necessario utilizzare un ruolo di database specifico durante la connessione.

Confronta l'applicazione dei ruoli

Sebbene IAM controlli l'accesso alla risorsa del database stessa, i ruoli del database Spanner controllano le autorizzazioni per gli oggetti all'interno del database.

Per utilizzare un ruolo del database FGAC, in genere sono necessarie le seguenti autorizzazioni:

  • L'autorizzazione IAM spanner.databases.useRoleBasedAccess, che spesso viene concessa tramite il ruolo roles/spanner.fineGrainedAccessUser.
  • Autorizzazione a utilizzare il ruolo database specifico, concessa tramite il ruolo roles/spanner.databaseRoleUser con una condizione IAM.

Per saperne di più sulla configurazione di queste autorizzazioni, consulta Configura FGAC.

Utilizza set di dati esterni

Il modo più semplice per eseguire query sulle tabelle Spanner è creare un set di dati esterno. Dopo aver creato il set di dati esterno, le tabelle del database Spanner corrispondente sono visibili in BigQuery e puoi utilizzarle nelle query, ad esempio in join, unioni o subquery. Tuttavia, non viene eseguito lo spostamento di dati da Spanner allo spazio di archiviazione di BigQuery.

Se crei un set di dati esterno, non è necessario creare una connessione per eseguire query sui dati Spanner.

Utilizza la funzione EXTERNAL_QUERY

Come per altri database federati, puoi anche eseguire query sui dati di Spanner con una funzione EXTERNAL_QUERY. Questo può essere utile se vuoi avere un maggiore controllo sui parametri di connessione.

Prima di iniziare

  • Assicurati che l'amministratore di BigQuery abbia creato una connessione Spanner e l'abbia condivisa con te. Consulta Scegli la connessione giusta.
  • Per ottenere le autorizzazioni necessarie per eseguire query su un'istanza Spanner, chiedi all'amministratore di concederti il ruolo IAM BigQuery Connection User (roles/bigquery.connectionUser) sulla connessione. Devi anche disporre delle autorizzazioni appropriate sul database Spanner, che dipendono dal fatto che tu sia un utente FGAC.
    • Se sei un utente con controllo dell'accesso granulare dell'accesso:
      • Devi disporre dei ruoli IAM necessari per utilizzare FGAC. Questi ruoli sono in genere roles/spanner.fineGrainedAccessUser e roles/spanner.databaseRoleUser. I ruoli vengono utilizzati con una condizione che specifica il ruolo del database.
      • Il ruolo del database Spanner specificato nella connessione deve disporre del privilegio SELECT su tutti gli oggetti schema a cui fanno riferimento le query. L'amministratore del database concede i privilegi utilizzando l'istruzione DDL GRANT (o l'equivalente di PostgreSQL).
    • Se non sei un utente con controllo dell'accesso granulare dell'accesso, devi disporre del ruolo IAM Lettore database Spanner (roles/spanner.databaseReader) sul database.

    Per informazioni sulla concessione dei ruoli IAM, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Scegli la connessione giusta

Se sei un utente con controllo dell'accesso granulare dell'accesso di Spanner, quando esegui una query federata con una funzione EXTERNAL_QUERY, devi utilizzare una connessione Spanner che specifica un ruolo del database. Questo ruolo database fa parte della configurazione FGAC all'interno del database Spanner, separato dai ruoli IAM. In questo modo, tutte le query eseguite con questa connessione utilizzano le autorizzazioni concesse a quel ruolo del database.

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

Esegui query sui dati

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

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

L'esempio seguente esegue una query federata su 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;

Spanner Data Boost

Data Boost è una funzionalità serverless completamente gestita che fornisce risorse di computing indipendenti per i workload Spanner supportati. Data Boost ti consente di eseguire query di analisi ed esportazioni di dati con un impatto minimo sui workload esistenti nell'istanza Spanner di cui è stato eseguito il provisioning. Data Boost ti consente di eseguire query federate con una capacità di computing indipendente, separata dalle istanze di cui hai eseguito il provisioning, per evitare di influire sui workload esistenti su Spanner. Data Boost è più utile quando esegui query ad hoc complesse o quando vuoi elaborare grandi quantità di dati senza influire sul workload Spanner esistente. L'esecuzione di query federate con Data Boost può comportare un consumo di CPU notevolmente inferiore e, in alcuni casi, 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 Cloud Spanner Database Reader with DataBoost (roles/spanner.databaseReaderWithDataBoost) sul database Spanner. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

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

Potresti anche ottenere questa autorizzazione con ruoli personalizzati o altri ruoli predefiniti.

Il ruolo IAM roles/spanner.databaseReaderWithDataBoost concede l'autorizzazione per utilizzare Data Boost. Questo ruolo è necessario in aggiunta alle autorizzazioni di base necessarie per leggere i dati, come roles/spanner.databaseReader per gli utenti non FGAC o le autorizzazioni di controllo dell'accesso granulare appropriate.

L'utilizzo di set di dati esterni con Spanner utilizza sempre Data Boost e pertanto richiede l'autorizzazione spanner.databases.useDataBoost.

Abilita Data Boost

Quando utilizzi set di dati esterni, Data Boost viene sempre utilizzato e non devi attivarlo manualmente.

Se vuoi utilizzare Data Boost per le query EXTERNAL_QUERY, devi abilitarlo quando crei una connessione utilizzata dalla query.

Lettura di dati in parallelo

Spanner può suddividere determinate query in parti più piccole, o partizioni, e recuperarle in parallelo. Per ulteriori informazioni, incluso un elenco di limitazioni, consulta Leggi i dati in parallelo nella documentazione di Spanner.

Per visualizzare il piano di esecuzione di una query Spanner, consulta Scopri come Spanner esegue le query.

Quando esegui query federate con set di dati esterni, viene sempre utilizzata l'opzione "Leggi i dati in parallelo".

Per abilitare le letture parallele quando utilizzi EXTERNAL_QUERY, attivalo quando crei la connessione.

Gestisci la priorità di esecuzione delle query

Quando esegui query federate con una funzione EXTERNAL_QUERY, puoi assegnare la priorità (high, medium o low) alle singole query specificando l'opzione 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 priorità predefinita è medium.

Le query con priorità high competono con il traffico transazionale. Le query con priorità low sono soggette a determinate condizioni e potrebbero essere prerilasciate dal carico in background, ad esempio i backup pianificati.

Quando esegui query federate con set di dati esterni, tutte le query hanno sempre la priorità medium.

Visualizza lo schema di una tabella Spanner

Se utilizzi set di dati esterni, le tabelle Spanner sono visibili direttamente in BigQuery Studio e puoi visualizzarne gli schemi.

Tuttavia, puoi anche visualizzare gli schemi senza definire set di dati esterni. Puoi anche utilizzare la funzione EXTERNAL_QUERY per eseguire query sulle viste information_schema per accedere ai metadati del database. L'esempio seguente restituisce informazioni sulle colonne della tabella MyTable:

Database GoogleSQL

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 saperne di più, consulta i seguenti riferimenti allo schema di informazioni nella documentazione di Spanner:

Prezzi

Query tra regioni

BigQuery supporta le query federate in cui le istanze Spanner e i set di dati BigQuery si trovano in regioni diverse. Queste query comportano un costo aggiuntivo per il trasferimento di dati Spanner. Per saperne di più, consulta i prezzi di Spanner.

Ti verrà addebitato il costo del trasferimento di dati in base ai seguenti SKU:

  • Trasferimento di dati di rete in uscita tra zone all'interno della regione
  • Trasferimento di dati di rete in uscita tra regioni nello stesso continente
  • Trasferimento di dati di rete in uscita tra regioni in un continente diverso

Il trasferimento di dati viene addebitato in base alla regione BigQuery in cui esegui la query e alla regione Spanner più vicina che ha repliche di lettura/scrittura o di sola lettura.

Per le configurazioni multiregionali di BigQuery (US o EU), i costi di trasferimento dei dati da Spanner vengono determinati come segue:

  • Località multiregionale BigQuery US: regione Spanner us-central1
  • Località multiregionale BigQuery EU: regione Spanner europe-west1

Ad esempio:

  • BigQuery (multiregione US) e Spanner (us-central1): si applicano i costi per il trasferimento di dati all'interno della stessa regione.
  • BigQuery (multiregione US) e Spanner (us-west4): si applicano i costi per il trasferimento di dati tra regioni all'interno dello stesso continente.

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 dalla radice.
Risoluzione: se configuri la connessione per leggere i dati in parallelo, il primo operatore nel piano di esecuzione della query deve essere un'unione distribuita oppure il piano di esecuzione non deve contenere unioni distribuite. Per risolvere questo errore, visualizza il piano di esecuzione della query e riscrivila. Per saperne di più, consulta Scopri come Spanner esegue le query.
Problema: scadenza superata.
Risoluzione: seleziona l'opzione per leggere i dati in parallelo e riscrivi la query in modo che sia partizionabile dalla radice. Per saperne di più, consulta Scopri come Spanner esegue le query.

Passaggi successivi