Utilizzare il runtime avanzato di BigQuery
Il runtime avanzato di BigQuery è un insieme di miglioramenti delle prestazioni progettati per accelerare automaticamente i carichi di lavoro analitici senza richiedere l'intervento dell'utente o modifiche al codice. Questo documento descrive questi miglioramenti delle prestazioni, tra cui la vettorializzazione avanzata e le ottimizzazioni delle query brevi.
Ruoli e autorizzazioni
Per ottenere le autorizzazioni necessarie per specificare un'impostazione di configurazione, chiedi all'amministratore di concederti il ruolo IAM Amministratore BigQuery (roles/bigquery.admin) nel progetto o nell'organizzazione.
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Vettorializzazione avanzata
L'esecuzione vettoriale è un modello di elaborazione delle query che opera su colonne di dati in blocchi allineati alle dimensioni della cache della CPU e utilizza istruzioni SIMD (Single Instruction, Multiple Data). La vettorializzazione avanzata estende l'esecuzione delle query vettoriali in BigQuery ai seguenti aspetti dell'elaborazione delle query:
- Sfruttando le codifiche dei dati specializzate all'interno del formato di archiviazione Capacitor, le operazioni di valutazione dei filtri possono essere eseguite sui dati codificati.
- Le codifiche specializzate vengono propagate tramite il piano di query, il che consente di elaborare più dati mentre sono ancora codificati.
- Implementando il folding delle espressioni per valutare le funzioni deterministiche e le espressioni costanti, BigQuery può semplificare i predicati complessi in valori costanti.
Ottimizzazioni delle query brevi
In genere, BigQuery esegue le query in un ambiente distribuito utilizzando un livello intermedio di shuffle. Le ottimizzazioni delle query brevi identificano dinamicamente le query che possono essere eseguite come una singola fase, riducendo la latenza e il consumo di slot. Le codifiche specializzate possono essere utilizzate in modo più efficace quando una query viene eseguita in una singola fase. Queste ottimizzazioni sono più efficaci se utilizzate con la modalità di creazione job facoltativa, che riduce al minimo la latenza di avvio, manutenzione e recupero dei risultati dei job.
L'idoneità alle ottimizzazioni delle query brevi è dinamica ed è influenzata dai seguenti fattori:
- Le dimensioni previste della scansione dei dati.
- La quantità di spostamento dei dati richiesta.
- La selettività dei filtri delle query.
- Il tipo e il layout fisico dei dati nello spazio di archiviazione.
- La struttura generale della query.
- Le statistiche storiche delle esecuzioni delle query precedenti.
Stimare l'impatto del runtime avanzato
Per stimare l'impatto del runtime avanzato, puoi utilizzare la seguente query SQL per identificare le query del progetto con il miglioramento stimato maggiore del tempo di esecuzione:
WITH
jobs AS (
SELECT
*,
query_info.query_hashes.normalized_literals AS query_hash,
TIMESTAMP_DIFF(end_time, start_time, MILLISECOND) AS elapsed_ms,
EXISTS(
SELECT 1
FROM UNNEST(JSON_QUERY_ARRAY(query_info.optimization_details.optimizations)) AS o
WHERE JSON_VALUE(o, '$.enhanced_vectorization') = 'applied'
) AS has_advanced_runtime
FROM region-LOCATION.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE EXTRACT(DATE FROM creation_time) > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
AND creation_time >= TIMESTAMP "2026-01-30"
),
most_recent_jobs_without_advanced_runtime AS (
SELECT *
FROM jobs
WHERE NOT has_advanced_runtime
QUALIFY ROW_NUMBER() OVER (PARTITION BY query_hash ORDER BY end_time DESC) = 1
)
SELECT
job.job_id,
100 * SAFE_DIVIDE(
original_job.elapsed_ms - job.elapsed_ms,
original_job.elapsed_ms) AS percent_execution_time_saved,
job.elapsed_ms AS new_elapsed_ms,
original_job.elapsed_ms AS original_elapsed_ms,
FROM jobs AS job
INNER JOIN most_recent_jobs_without_advanced_runtime AS original_job
USING (query_hash)
WHERE
job.has_advanced_runtime
AND original_job.end_time < job.start_time
ORDER BY percent_execution_time_saved DESC
LIMIT 10;
Sostituisci quanto segue:
LOCATION: la località in cui devono essere misurate le prestazioni del job
Se è stato applicato il runtime avanzato, i risultati di questa query potrebbero essere simili ai seguenti:
/*--------------+----------------------------+----------------+---------------------*
| job_id | percent_elapsed_time_saved | new_elapsed_ms | original_elapsed_ms |
+--------------+----------------------------+----------------+---------------------+
| sample_job1 | 45.38834951456311 | 225 | 412 |
| sample_job2 | 45.19480519480519 | 211 | 385 |
| sample_job3 | 33.246753246753244 | 257 | 385 |
| sample_job4 | 29.28802588996764 | 1311 | 1854 |
| sample_job5 | 28.18181818181818 | 1027 | 1430 |
| sample_job6 | 25.804195804195807 | 1061 | 1430 |
| sample_job7 | 25.734265734265733 | 1062 | 1430 |
| sample_job8 | 25.454545454545453 | 1066 | 1430 |
| sample_job9 | 25.384615384615383 | 1067 | 1430 |
| sample_job10 | 25.034965034965033 | 1072 | 1430 |
*--------------+----------------------------+----------------+---------------------*/
I risultati di questa query sono solo una stima dell'impatto del runtime avanzato. Molti fattori possono influenzare le prestazioni delle query, tra cui, a titolo esemplificativo, la disponibilità di slot, la modifica dei dati nel tempo, le definizioni di visualizzazioni o UDF e le differenze nei valori dei parametri delle query.
Se i risultati di questa query sono vuoti, significa che nessun job ha utilizzato il runtime avanzato o che tutti i job sono stati ottimizzati più di 30 giorni fa.
Questa query può essere applicata ad altre metriche delle prestazioni delle query, come total_slot_ms e total_bytes_billed. Per ulteriori informazioni, consulta lo schema
per INFORMATION_SCHEMA.JOBS_BY_PROJECT.