Query globali

Le query globali ti consentono di eseguire query SQL che fanno riferimento a dati archiviati in più di una regione. Ad esempio, puoi eseguire una query globale che unisce una tabella che si trova in us-central1 con una tabella che si trova in europe-central2. Questo documento spiega come abilitare ed eseguire query globali nel tuo progetto.

Prima di iniziare

Verifica che le query globali siano abilitate per il tuo progetto e assicurati di disporre delle autorizzazioni necessarie per eseguirle.

Abilita le query globali

Per abilitare le query globali per il tuo progetto o la tua organizzazione, utilizza l'istruzione ALTER PROJECT SET OPTIONS o l'istruzione ALTER ORGANIZATION SET OPTIONS per modificare la configurazione predefinita.

  • Per eseguire query globali in una regione, imposta l'argomento enable_global_queries_execution su true in quella regione per il progetto che esegue la query.
  • Per consentire alle query globali di copiare i dati da una regione, imposta l'argomento enable_global_queries_data_access su true in quella regione per il progetto contenente i dati.
  • Queste opzioni vengono controllate ogni volta che la query accede a tabelle remote.
  • Le query globali possono essere eseguite in un progetto e recuperare dati da altre regioni di un altro progetto.

Esempio: configurazione tra progetti

L'esempio seguente mostra come eseguire una query in un progetto che accede a una tabella in un altro progetto.

Supponiamo che tu abbia un progetto query_project che esegue job nella regione us-central1 e che tu voglia eseguire una query che accede a una tabella data_project.dataset.my_table situata nella regione europe-west1:

SET @@location='us-central1';
SELECT
  *
FROM
  `query_project.dataset.my_table`
  JOIN `data_project.dataset.my_other_table` USING id;

Per consentire l'esecuzione corretta di questa query globale, è necessaria la seguente configurazione:

  1. Devi abilitare l'esecuzione di query globali nel progetto (query_project) nella regione che esegue una query globale (us-central1):

    ALTER PROJECT `query_project`
    SET OPTIONS (
    `region-us-central1.enable_global_queries_execution` = TRUE
    )
  2. Devi abilitare la copia dei dati tramite query globali dal progetto contenente i dati (data_project) per la relativa regione (europe-west1):

    ALTER PROJECT `data_project`
    SET OPTIONS (
    `region-europe-west1.enable_global_queries_data_access` = TRUE
    )

Per creare e utilizzare viste che contengono tabelle remote, si applicano gli stessi principi: il progetto che esegue le query deve avere enable_global_queries_execution abilitato.

Queste operazioni ALTER PROJECT devono essere eseguite separatamente, poiché fanno riferimento a progetti e regioni diversi. Potrebbero essere necessari alcuni minuti prima che la modifica diventi effettiva.

Autorizzazione obbligatoria

Per eseguire una query globale, devi disporre dell'autorizzazione bigquery.jobs.createGlobalQuery. Il ruolo Amministratore BigQuery è l'unico ruolo predefinito che contiene questa autorizzazione. Per concedere l'autorizzazione a eseguire query globali senza concedere il ruolo Amministratore BigQuery, segui questi passaggi:

  1. Crea un ruolo personalizzato, ad esempio "Esecutore di query globali BigQuery".
  2. Aggiungi bigquery.jobs.createGlobalQuery a questo ruolo.
  3. Assegna questo ruolo agli utenti o ai service account selezionati.

Esegui query sui dati

Per eseguire una query globale, scrivi una query SQL come faresti se i dati si trovassero in un'unica località. Se i dati a cui fa riferimento la query sono archiviati in più località, BigQuery tenta di eseguire una query globale. Se non specifichi la località in cui eseguire la query, BigQuery la seleziona automaticamente in base alle località delle tabelle di riferimento. Per saperne di più, consulta Scegli una località. I dati a cui fa riferimento la query che non si trovano nella località selezionata vengono copiati in quella località.

L'esempio seguente viene eseguito come query globale che unisce tabelle di due set di dati diversi archiviati in due località diverse:

SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions

Scegli una località

Per configurare la località in cui verrà eseguita la query globale, specifica una località. Quando decidi una località di esecuzione per la query globale, tieni presente quanto segue:

  • Residenza dei dati:le query globali copiano temporaneamente i dati da una località all'altra. Se la tua organizzazione ha requisiti per la residenza dei dati e non vuoi che i tuoi dati lascifno una determinata località, imposta la località della query su quella località.

  • Costi e prestazioni del trasferimento: per ridurre al minimo la quantità di dati trasferiti tra le località e il costo della query, esegui la query nella regione in cui è archiviata la maggior parte dei dati su cui viene eseguita la query.

    Ad esempio, hai un negozio online e conservi un elenco dei tuoi prodotti nella località us-central1, ma conservi le transazioni nella regione us-south1. Se nel tuo catalogo sono presenti più transazioni che prodotti, devi eseguire la query nella regione us-south1.

  • Prenotazioni e capacità di calcolo: specifica la località della query per controllare quali prenotazioni o slot regionali elaborano la query.

Se non specifichi manualmente una località, BigQuery determina automaticamente la località di esecuzione in base ai seguenti criteri:

  • Per le query DML (Data Manipulation Language) (istruzioni INSERT, UPDATE e DELETE), la località della tabella di destinazione viene selezionata come località di esecuzione.
  • Per le query DDL (Data Definition Language), ad esempio le istruzioni CREATE TABLE AS SELECT, la località in cui viene creata o modificata la risorsa viene selezionata come località di esecuzione.
  • Per le query con una tabella di destinazione specificata, la località della tabella di destinazione viene selezionata come località di esecuzione.
  • Per tutte le altre query, la località di esecuzione viene selezionata arbitrariamente come una delle località dei set di dati di riferimento.

Informazioni sulle query globali

Per eseguire query globali in modo efficiente e conveniente, è importante comprendere il meccanismo alla base della loro esecuzione.

Per utilizzare i dati che si trovano in località diverse, devi replicarli in un'unica località. Di seguito è riportata un'astrazione del workflow di query globale eseguito da BigQuery:

  1. Determina dove deve essere eseguita la query, in base alla dichiarazione dell'utente o automaticamente. Questa località è chiamata località principale e tutte le altre località a cui fa riferimento la query sono remote.
  2. Eseguire una sottoquery in ogni regione remota per raccogliere i dati necessari per completare la query nella regione principale.
  3. Copia questi dati dalle località remote alla località principale.
  4. Salvare i dati in tabelle temporanee nella località principale per 24 ore. Per i risultati delle sottoquery inferiori a 10 GiB, i dati potrebbero essere memorizzati nella cache per essere riutilizzati ed evitare il trasferimento di dati tra regioni.
  5. Esegui una query finale con tutti i dati raccolti nella località principale.
  6. Restituisce i risultati della query.

BigQuery cerca di ridurre al minimo la quantità di dati trasferiti tra le regioni. Considera l'esempio seguente:

SET @@location = 'EU';
SELECT
  t1.col1, t2.col2
FROM
  eu_dataset.table1 t1
  JOIN us_dataset.table2 t2 using col3
WHERE
  t2.col4 = 'ABC'

BigQuery non deve replicare tutta la tabella t2 dagli Stati Uniti all'UE. È sufficiente trasferire solo le colonne richieste (col2 e col3) e solo le righe che corrispondono alla condizione WHERE (t2.col4 = 'ABC'). Tuttavia, questi meccanismi, noti come pushdown, dipendono dalla struttura della query e a volte la quantità di dati trasferiti potrebbe essere elevata. Ti consigliamo di testare le query globali su un piccolo sottoinsieme di dati e di verificare che i dati vengano trasferiti solo quando necessario.

Osservabilità

Per monitorare le query globali e ispezionare la loro esecuzione nelle varie regioni, puoi utilizzare i seguenti metodi:

Cronologia dei job

Per visualizzare il testo della query inviato alla regione remota, controlla la cronologia dei job. Il job remoto ha lo stesso ID job della query originale con un suffisso _xregion aggiuntivo.

API REST Jobs

Quando chiami il metodo jobs.get, la risorsa Job restituita contiene i seguenti campi nell'oggetto JobStatistics:

  • statistics.globalQueryRemoteRegions: un array di stringhe che rappresentano le regioni remote da cui una query globale accede ai dati. Questo campo viene compilato solo per i job di query globali principali nella regione di esecuzione principale. È vuoto per i job di query globali secondari e le query in una singola regione.
  • statistics.parentGlobalQueryJob: un oggetto JobReference (projectId, jobId, location) che identifica il job di query globale principale. Questo campo viene compilato solo per i job di query globali secondari (subquery remote e job di copia tra regioni) eseguiti in regioni remote per conto di una query globale. Non è impostato per i job di query globali principali e le query in una singola regione.

Audit log

In Cloud Audit Logs, l'oggetto BigQueryAuditMetadata contiene i seguenti campi nell'oggetto JobStats:

  • jobStats.globalQueryRemoteRegions: un array di stringhe che rappresentano le regioni remote a cui accede la query. Questo campo viene compilato solo per i job di query globali principali nella regione di esecuzione principale.
  • jobStats.parentGlobalQueryJobId: l'ID job del job di query globale principale. Questo campo viene compilato per i job secondari eseguiti in regioni remote.
  • jobStats.parentGlobalQueryJobLocation: la località del job di query globale principale. Questo campo viene compilato per i job secondari eseguiti in regioni remote.

Trova job secondari remoti per una query globale

Per trovare tutti i job secondari remoti associati a una query globale principale, puoi eseguire query sugli audit log utilizzando Analisi dei log o un set di dati del sink di log esportato:

SELECT
  timestamp,
  proto_payload.audit_log.resource_name AS resource_name,
  JSON_VALUE(proto_payload.audit_log.metadata.jobChange.job.jobConfig.queryConfig.query) AS query
FROM
  `PROJECT_ID.LOG_DATASET._AllLogs`
WHERE
  JSON_VALUE(proto_payload.audit_log.metadata.jobChange.job.jobStats.parentGlobalQueryJobId) = 'PARENT_JOB_ID';

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • LOG_DATASET: il set di dati collegato a BigQuery per Analisi dei log o il set di dati di destinazione del sink di log.
  • PARENT_JOB_ID: l'ID job del job di query globale principale.

Viste INFORMATION_SCHEMA

Puoi eseguire query sulle viste INFORMATION_SCHEMA.JOBS e INFORMATION_SCHEMA.JOBS_TIMELINE per esaminare i metadati per le query globali. La colonna global_query_info contiene i seguenti campi:

  • parent_job_id: l'ID del job di query globale principale nella regione principale. Questo campo viene compilato per le sottoquery secondarie e i job di copia eseguiti in regioni remote.
  • parent_job_location: la località del job di query globale principale.
  • remote_regions: un array di regioni remote a cui fa riferimento la query. Questo campo viene compilato per il job di query globale principale nella regione principale.

Identifica le query globali in una regione principale

Per trovare tutte le query globali eseguite in una regione principale e vedere quali regioni remote sono state referenziate, esegui una query sulla vista INFORMATION_SCHEMA.JOBS nella regione principale:

SELECT
  job_id,
  creation_time,
  query,
  total_bytes_billed,
  global_query_info.remote_regions
FROM
  `region-REGION`.INFORMATION_SCHEMA.JOBS
WHERE
  ARRAY_LENGTH(global_query_info.remote_regions) > 0;

Sostituisci REGION con la regione in cui è stata eseguita la query globale, ad esempio us-central1.

Trova job secondari remoti per una query globale

Per trovare tutti i job secondari remoti associati a una query globale principale, esegui una query sulla vista INFORMATION_SCHEMA.JOBS nella regione remota:

SELECT
  job_id,
  project_id,
  job_type,
  statement_type,
  total_bytes_billed,
  total_slot_ms
FROM
  `region-REMOTE_REGION`.INFORMATION_SCHEMA.JOBS
WHERE
  global_query_info.parent_job_id = 'PARENT_JOB_ID';

Sostituisci quanto segue:

  • REMOTE_REGION: la regione remota in cui è stato eseguito il job di copia o la sottoquery secondaria, ad esempio europe-west1.
  • PARENT_JOB_ID: l'ID job del job di query globale principale.

Disattiva le query globali

Per disabilitare le query globali per il tuo progetto o la tua organizzazione, utilizza ALTER PROJECT SET OPTIONS statement o ALTER ORGANIZATION SET OPTIONS statement per modificare la configurazione predefinita.

  • Per disattivare le query globali in una regione, imposta l'argomento enable_global_queries_execution su false o NULL in quella regione.
  • Per impedire alle query globali di copiare dati da una regione, imposta l'argomento enable_global_queries_data_access su false o NULL in quella regione.

L'esempio seguente mostra come disattivare le query globali a livello di progetto:

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.enable_global_queries_execution` = false,
  `region-REGION.enable_global_queries_data_access` = false
);

Sostituisci quanto segue:

  • PROJECT_ID: il nome del progetto da modificare
  • REGION: il nome della regione in cui disattivare le query globali

Potrebbero essere necessari alcuni minuti prima che la modifica diventi effettiva.

Prezzi

Il costo di una query globale è costituito dai seguenti componenti:

  • Il costo di calcolo di ogni sottoquery in località remote, in base al tuo modello di prezzi in queste località
  • Il costo di calcolo della query finale nella regione in cui viene eseguita, in base al tuo modello di prezzi in quella regione
  • Il costo della copia dei dati tra località diverse, in base ai prezzi della replica dei dati
  • Il costo di archiviazione dei dati copiati dalle regioni remote alla regione principale (per 24 ore), in base ai prezzi di archiviazione

Quote

Per informazioni sulle quote relative alle query globali, consulta Job di query.

Limitazioni

  • Le query globali non sono supportate in Assured Workloads.
  • Le query globali non sono supportate quando si utilizzano gli endpoint regionali.
  • Le query globali non sono supportate in modalità sandbox.
  • Le query globali comportano una latenza maggiore rispetto alle query in una singola regione a causa del tempo necessario per trasferire i dati tra le regioni.
  • Le query globali non vengono eseguite in modo atomico. Nei casi in cui la replica dei dati va a buon fine, ma la query complessiva non riesce, ti verrà comunque addebitato il costo della replica dei dati.
  • Una singola query globale può accedere fino a 10 tabelle remote per regione.
  • Le tabelle temporanee create in regioni remote nell'ambito dell'esecuzione di query globali vengono criptate utilizzando le chiavi di crittografia gestite dal cliente (CMEK) solo se una chiave CMEK configurata per criptare i risultati delle query globali (a livello di tabella, set di dati o progetto) è globale. Per assicurarti che le tabelle temporanee remote siano sempre protette utilizzando CMEK, imposta una chiave KMS predefinita per il progetto che esegue query globali nella regione remota.
  • Le viste autorizzate e le routine autorizzate globali non sono supportate (quando una vista o una routine in una località è autorizzata ad accedere al set di dati in un'altra località). Crea invece viste autorizzate nella regione in cui si trovano i dati ed esegui query sulle viste autorizzate tramite query globali.
  • Le viste materializzate sulle query globali non sono supportate.
  • Non puoi eseguire query su colonne tipizzate RANGE con query globali.
  • Non puoi eseguire query su pseudocolonne, come _PARTITIONTIME, con query globali.
  • Non puoi eseguire query sulle colonne utilizzando nomi di colonna flessibili con query globali.
  • Se la query globale fa riferimento a STRUCT colonne, non vengono applicati pushdown alle sottoquery remote. Per ottimizzare le prestazioni, valuta la possibilità di creare una vista nella regione remota che filtri le colonne STRUCT e restituisca solo i campi necessari come singole colonne.
  • I dettagli di esecuzione e il grafico di esecuzione di una query non mostrano il numero di byte elaborati e trasferiti da località remote. Queste informazioni vengono visualizzate nei job di copia che puoi trovare nella cronologia dei job. L'ID job di un job di copia creato da una query globale ha come prefisso l'ID job del job di query.
  • Le query globali sono supportate in Data Studio solo se sono inserite in una vista e configurate per l'utilizzo delle credenziali del visualizzatore.