Eseguire query su più tabelle utilizzando una tabella con funzione carattere jolly

Le tabelle con caratteri jolly ti consentono di eseguire query su più tabelle utilizzando istruzioni SQL concise. Le tabelle con caratteri jolly sono disponibili solo in GoogleSQL. Per la funzionalità equivalente in SQL precedente, consulta Funzioni con caratteri jolly per le tabelle.

Una tabella con funzione carattere jolly rappresenta un'unione di tutte le tabelle che corrispondono all'espressione con carattere jolly. Ad esempio, la seguente clausola FROM utilizza l'espressione con caratteri jolly gsod* per trovare tutte le tabelle del set di dati noaa_gsod che iniziano con la stringa gsod.

FROM
  `bigquery-public-data.noaa_gsod.gsod*`

Ogni riga della tabella con funzione carattere jolly contiene una colonna speciale, _TABLE_SUFFIX, che contiene il valore corrispondente al carattere jolly.

Limitazioni

Le query sulle tabelle con caratteri jolly sono soggette alle seguenti limitazioni.

  • La funzionalità tabella con funzione carattere jolly non supporta le visualizzazioni. Se la tabella con funzione carattere jolly corrisponde a una vista nel set di dati, la query restituisce un errore anche se contiene una clausola WHERE nella pseudocolonna _TABLE_SUFFIX per escludere la vista.
  • I risultati memorizzati nella cache non sono supportati per le query su più tabelle che utilizzano un carattere jolly anche se è selezionata l'opzione Utilizza risultati memorizzati nella cache. Se esegui la stessa query con caratteri jolly più volte, ti viene addebitato un importo per ogni query.
  • Le tabelle con caratteri jolly supportano solo lo spazio di archiviazione BigQuery integrato. Non puoi utilizzare i caratteri jolly per eseguire query su una tabella esterna o su una vista.
  • Non puoi utilizzare query con caratteri jolly su tabelle con partizionamento incompatibile o su una combinazione di tabelle partizionate e non partizionate. Inoltre, le tabelle sottoposte a query devono avere specifiche di clustering identiche.
  • Puoi utilizzare le tabelle con caratteri jolly con le tabelle partizionate e sono supportati sia il pruning delle partizioni sia il pruning dei cluster. Tuttavia, le tabelle raggruppate in cluster, ma non partizionate, non traggono alcun vantaggio dall'utilizzo di caratteri jolly per il travaglio dei cluster.
  • Le query che contengono istruzioni DML (Data Manipulation Language) non possono utilizzare una tabella con funzione carattere jolly come destinazione della query. Ad esempio, una tabella con funzione carattere jolly può essere utilizzata nella clausola FROM di una query UPDATE, ma non può essere utilizzata come destinazione dell'operazione UPDATE.
  • I filtri sulle pseudocolonne _TABLE_SUFFIX o _PARTITIONTIME che includono funzioni definite dall'utente JavaScript non limitano il numero di tabelle sottoposte a scansione in una tabella con funzione carattere jolly.
  • Le query con caratteri jolly non sono supportate per le tabelle protette da chiavi di crittografia gestite dal cliente (CMEK).
  • Tutte le tabelle a cui viene fatto riferimento in una query con caratteri jolly devono avere esattamente lo stesso insieme di chiavi e valori di tag.
  • Quando utilizzi le tabelle con caratteri jolly, tutte le tabelle del set di dati che iniziano con il nome della tabella prima di * vengono sottoposte a scansione anche se _TABLE_SUFFIX viene utilizzato in combinazione con REGEXP_CONTAINS e viene fornita un'espressione regolare, ad esempio ^[0-9]{2}$. Ad esempio:

    SELECT *
    FROM `my_project.my_dataset.my_table_*`
    WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, '^[0-9]{2}$');
    
  • Se una singola tabella sottoposta a scansione presenta una mancata corrispondenza dello schema (ovvero una colonna con lo stesso nome è di tipo diverso), la query non va a buon fine con l'errore Impossibile leggere il campo di tipo X come campo Y: nome_colonna. Tutte le tabelle vengono associate anche se utilizzi l'operatore di uguaglianza =. Ad esempio, nella seguente query viene eseguita la scansione anche della tabella my_dataset.my_table_03_backup. Di conseguenza, la query potrebbe non riuscire a causa di una mancata corrispondenza dello schema. Tuttavia, se non esiste una mancata corrispondenza dello schema, i risultati provengono solo dalla tabella my_dataset.my_table_03, come previsto.

    SELECT *
    FROM my_project.my_dataset.my_table_*
    WHERE _TABLE_SUFFIX = '03'
    

Prima di iniziare

Quando utilizzare le tabelle con caratteri jolly

Le tabelle con funzione carattere jolly sono utili quando un set di dati contiene più tabelle con nomi simili e schemi compatibili. In genere, questi set di dati contengono tabelle che rappresentano ciascuna i dati di un singolo giorno, mese o anno. Ad esempio, un set di dati pubblico ospitato da BigQuery, il NOAA Global Surface Summary of the Day Weather Data, contiene una tabella per ogni anno dal 1929 a oggi.

Una query che esegue la scansione di tutti gli ID tabella dal 1929 al 1940 sarebbe molto lunga se dovessi assegnare un nome a tutte e 12 le tabelle nella clausola FROM (la maggior parte delle tabelle è omessa in questo esempio):

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM (
  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1929` UNION ALL
  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1930` UNION ALL
  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1931` UNION ALL

  # ... Tables omitted for brevity

  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1940` )
WHERE
  max != 9999.9 # code for missing data
ORDER BY
  max DESC

La stessa query che utilizza una tabella con funzione carattere jolly è molto più concisa:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod19*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX BETWEEN '29'
  AND '40'
ORDER BY
  max DESC
Le tabelle con caratteri jolly supportano solo lo spazio di archiviazione BigQuery integrato. Non puoi utilizzare i caratteri jolly quando esegui query su una tabella esterna o una vista.

Sintassi della tabella con caratteri jolly

Sintassi della tabella con caratteri jolly:

SELECT
FROM
  `<project-id>.<dataset-id>.<table-prefix>*`
WHERE
  bool_expression
<project-id>
ID progetto Cloud. Facoltativo se utilizzi l'ID progetto predefinito.
<dataset-id>
ID set di dati BigQuery
.
<table-prefix>
Una stringa comune a tutte le tabelle corrispondenti al carattere jolly. Il prefisso della tabella è facoltativo. L'omissione del prefisso della tabella corrisponde a tutte le tabelle del set di dati.
* (carattere jolly)
Il carattere jolly "*" rappresenta uno o più caratteri di un nome tabella. Il carattere jolly può apparire solo come carattere finale di un nome tabella con funzione carattere jolly.

Le query con tabelle con caratteri jolly supportano la pseudocolonna _TABLE_SUFFIX nella clausola WHERE. Questa colonna contiene i valori corrispondenti al carattere jolly, in modo che le query possano filtrare le tabelle a cui viene eseguito l'accesso. Ad esempio, le seguenti clausole WHERE utilizzano operatori di confronto per filtrare le tabelle corrispondenti:

WHERE
  _TABLE_SUFFIX BETWEEN '29' AND '40'

WHERE
  _TABLE_SUFFIX = '1929'

WHERE
  _TABLE_SUFFIX < '1941'

Per ulteriori informazioni sulla pseudocolonna _TABLE_SUFFIX, consulta Applicare filtri a tabelle selezionate utilizzando _TABLE_SUFFIX.

Racchiudi i nomi delle tabelle con caratteri jolly tra backtick

Il nome della tabella con funzione carattere jolly contiene il carattere speciale (*), il che significa che devi racchiudere il nome della tabella con funzione carattere jolly tra apici inversi (`). Ad esempio, la seguente query è valida perché utilizza i backtick:

#standardSQL
/* Valid SQL query */
SELECT
  max
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

La seguente query NON è valida perché non è racchiusa tra virgolette con i simboli ".

#standardSQL
/* Syntax error: Expected end of statement but got "-" at [4:11] */
SELECT
  max
FROM
  # missing backticks
  bigquery-public-data.noaa_gsod.gsod*
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

Le virgolette non funzionano:

#standardSQL
/* Syntax error: Unexpected string literal: 'bigquery-public-data.noaa_gsod.gsod*' at [4:3] */
SELECT
  max
FROM
  # quotes are not backticks
  'bigquery-public-data.noaa_gsod.gsod*'
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

Esegui query sulle tabelle utilizzando le tabelle con caratteri jolly

Le tabelle con caratteri jolly ti consentono di eseguire query su più tabelle in modo conciso. Ad esempio, un set di dati pubblico ospitato da BigQuery, NOAA Global Surface Summary of the Day Weather Data, contiene una tabella per ogni anno dal 1929 a oggi che condividono tutte il prefisso comune gsod seguito dall'anno a quattro cifre. Le tabelle sono denominate gsod1929, gsod1930, gsod1931 e così via.

Per eseguire query su un gruppo di tabelle che condividono un prefisso comune, utilizza il simbolo del carattere jolly della tabella (*) dopo il prefisso della tabella nell'istruzione FROM. Ad esempio, la seguente query trova la temperatura massima registrata negli anni '40:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod194*`
WHERE
  max != 9999.9 # code for missing data
ORDER BY
  max DESC

Filtrare le tabelle selezionate utilizzando _TABLE_SUFFIX

Per limitare una query in modo che esamini solo un insieme specificato di tabelle, utilizza la pseudocolonna _TABLE_SUFFIX in una clausola WHERE con una condizione che sia un'espressione costante.

La pseudocolonna _TABLE_SUFFIX contiene i valori corrispondenti al carattere jolly della tabella. Ad esempio, la query di esempio precedente, che esegue la scansione di tutte le tabelle degli anni '40, utilizza un carattere jolly per la tabella per rappresentare l'ultima cifra dell'anno:

FROM
  `bigquery-public-data.noaa_gsod.gsod194*`

La pseudocolonna _TABLE_SUFFIX corrispondente contiene valori nell'intervallo da 0 a 9, che rappresentano le tabelle da gsod1940 a gsod1949. Questi valori _TABLE_SUFFIX possono essere utilizzati in una clausola WHERE per filtrare in base a tabelle specifiche.

Ad esempio, per filtrare in base alla temperatura massima negli anni 1940 e 1944, utilizza i valori 0 e 4 per _TABLE_SUFFIX:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod194*`
WHERE
  max != 9999.9 # code for missing data
  AND ( _TABLE_SUFFIX = '0'
    OR _TABLE_SUFFIX = '4' )
ORDER BY
  max DESC

L'utilizzo di _TABLE_SUFFIX può ridurre notevolmente il numero di byte sottoposti a scansione, contribuendo a ridurre il costo di esecuzione delle query.

Tuttavia, i filtri su _TABLE_SUFFIX che includono condizioni senza espressioni costanti non limitano il numero di tabelle analizzate in una tabella con funzione carattere jolly. Ad esempio, la seguente query non limita le tabelle sottoposte a scansione per la tabella con caratteri jolly bigquery-public-data.noaa_gsod.gsod19* perché il filtro utilizza il valore dinamico della colonna table_id:

#standardSQL
# Scans all tables that match the prefix `gsod19`
SELECT
  ROUND((max-32)*5/9,1) celsius
FROM
  `bigquery-public-data.noaa_gsod.gsod19*`
WHERE
  _TABLE_SUFFIX = (SELECT SUBSTR(MAX(table_name), LENGTH('gsod19') + 1)
      FROM `bigquery-public-data.noaa_gsod.INFORMATION_SCHEMA.TABLES`
      WHERE table_name LIKE 'gsod194%')

Un altro esempio è la seguente query, che limita la scansione in base alla prima condizione di filtro, _TABLE_SUFFIX BETWEEN '40' and '60', perché è un'espressione costante. Tuttavia, la seguente query non limita la ricerca in base alla seconda condizione di filtro, _TABLE_SUFFIX = (SELECT SUBSTR(MAX(table_name), LENGTH('gsod19') + 1) FROM bigquery-public-data.noaa_gsod.INFORMATION_SCHEMA.TABLES WHERE table_name LIKE 'gsod194%'), perché è un'espressione dinamica:

#standardSQL
# Scans all tables with names that fall between `gsod1940` and `gsod1960`
SELECT
  ROUND((max-32)*5/9,1) celsius
FROM
  `bigquery-public-data.noaa_gsod.gsod19*`
WHERE
  _TABLE_SUFFIX BETWEEN '40' AND '60'
  AND _TABLE_SUFFIX = (SELECT SUBSTR(MAX(table_name), LENGTH('gsod19') + 1)
      FROM `bigquery-public-data.noaa_gsod.INFORMATION_SCHEMA.TABLES`
      WHERE table_name LIKE 'gsod194%')

Come soluzione alternativa, puoi eseguire due query separate, ad esempio:

Prima query:

#standardSQL
# Get the list of tables that match the required table name prefixes
SELECT SUBSTR(MAX(table_name), LENGTH('gsod19') + 1)
      FROM `bigquery-public-data.noaa_gsod.INFORMATION_SCHEMA.TABLES`
      WHERE table_name LIKE 'gsod194%'

Seconda query:

#standardSQL
# Construct the second query based on the values from the first query
SELECT
  ROUND((max-32)*5/9,1) celsius
FROM
  `bigquery-public-data.noaa_gsod.gsod19*`
WHERE _TABLE_SUFFIX = '49'

Queste query di esempio utilizzano la visualizzazione INFORMATION_SCHEMA.TABLES. Per ulteriori informazioni sulla tabella INFORMATION_SCHEMA, consulta Recupero dei metadati della tabella utilizzando INFORMATION_SCHEMA.

Scansione di un intervallo di tabelle utilizzando _TABLE_SUFFIX

Per eseguire la scansione di un intervallo di tabelle, utilizza la pseudocolonna _TABLE_SUFFIX insieme alla clausola BETWEEN. Ad esempio, per trovare la temperatura massima registrata tra il 1929 e il 1935 inclusi, utilizza il carattere jolly della tabella per rappresentare le ultime due cifre dell'anno:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod19*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX BETWEEN '29' and '35'
ORDER BY
  max DESC

Scansione di un intervallo di tabelle partizionate per data di importazione utilizzando _PARTITIONTIME

Per eseguire la scansione di un intervallo di tabelle partizionate per data di importazione, utilizza la pseudocolonna _PARTITIONTIME con la pseudocolonna _TABLE_SUFFIX. Ad esempio, la seguente query esegue la scansione della partizione del 1° gennaio 2017 nella tabella my_dataset.mytable_id1.

#standardSQL
SELECT
  field1,
  field2,
  field3
FROM
  `my_dataset.mytable_*`
WHERE
  _TABLE_SUFFIX = 'id1'
  AND _PARTITIONTIME = TIMESTAMP('2017-01-01')

Eseguire query su tutte le tabelle di un set di dati

Per eseguire la scansione di tutte le tabelle di un set di dati, puoi utilizzare un prefisso vuoto e il carattere jolly per le tabelle, il che significa che la pseudocolonna _TABLE_SUFFIX contiene i nomi completi delle tabelle. Ad esempio, la seguente clausola FROM esegue la scansione di tutte le tabelle nel set di dati GSOD:

FROM
  `bigquery-public-data.noaa_gsod.*`

Con un prefisso vuoto, la pseudocolonna _TABLE_SUFFIX contiene i nomi completi delle tabelle. Ad esempio, la seguente query è equivalente all'esempio precedente che trova la temperatura massima tra il 1929 e il 1935, ma utilizza i nomi completi delle tabelle nella clausola WHERE:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX BETWEEN 'gsod1929' and 'gsod1935'
ORDER BY
  max DESC

Tieni presente, tuttavia, che i prefissi più lunghi hanno in genere un rendimento migliore. Per ulteriori informazioni, consulta le best practice.

Dettagli sull'esecuzione della query

Schema utilizzato per la valutazione delle query

Per eseguire una query GoogleSQL che utilizza una tabella con funzione carattere jolly, BigQuery deduce automaticamente lo schema della tabella. BigQuery utilizza lo schema della tabella creata più di recente che corrisponde al carattere jolly come schema per la tabella con funzione carattere jolly. Anche se limiti il numero di tabelle che vuoi utilizzare dalla tabella con funzione carattere jolly utilizzando la pseudocolonna _TABLE_SUFFIX in una clausola WHERE, BigQuery utilizza lo schema della tabella creata più di recente che corrisponde al carattere jolly.

Se una colonna dello schema dedotto non esiste in una tabella con corrispondenza, BigQuery restituisce valori NULL per quella colonna nelle righe della tabella in cui manca la colonna.

Se lo schema non è coerente nelle tabelle corrispondenti alla query con caratteri jolly, BigQuery restituisce un errore. Questo accade quando le colonne delle tabelle corrispondenti hanno tipi di dati diversi o quando non è possibile presumere che le colonne non presenti in tutte le tabelle corrispondenti abbiano un valore null.

Best practice

  • In genere, i prefissi più lunghi hanno un rendimento migliore rispetto a quelli più brevi. Ad esempio, la seguente query utilizza un prefisso lungo (gsod200):

    #standardSQL
    SELECT
    max
    FROM
    `bigquery-public-data.noaa_gsod.gsod200*`
    WHERE
    max != 9999.9 # code for missing data
    AND _TABLE_SUFFIX BETWEEN '0' AND '1'
    ORDER BY
    max DESC

    La seguente query in genere ha prestazioni inferiori perché utilizza un prefisso vuoto:

    #standardSQL
    SELECT
    max
    FROM
    `bigquery-public-data.noaa_gsod.*`
    WHERE
    max != 9999.9 # code for missing data
    AND _TABLE_SUFFIX BETWEEN 'gsod2000' AND 'gsod2001'
    ORDER BY
    max DESC
  • Il partizionamento è consigliato rispetto allo sharding, perché le tabelle partizionate hanno un rendimento migliore. Lo sharding riduce le prestazioni e crea più tabelle da gestire. Per maggiori informazioni, consulta Partizionamento e suddivisione in parti.

Per le best practice per il controllo dei costi in BigQuery, consulta Controllo dei costi in BigQuery

Passaggi successivi