Utilizza ottimizzazioni basate sulla cronologia
Per assistenza durante l'anteprima, invia un'email all'indirizzo bigquery-history-based-optimization-support@google.com.
Questa guida descrive come attivare, disattivare e analizzare ottimizzazioni basate sulla cronologia per le query.
Informazioni sulle ottimizzazioni basate sulla cronologia
Le ottimizzazioni basate sulla cronologia utilizzano le informazioni delle esecuzioni già completate di query simili per applicare ulteriori ottimizzazioni e migliorare ulteriormente le prestazioni delle query, come il tempo di slot utilizzato e la latenza delle query. Ad esempio: quando applichi l'ottimizzazione basata sulla cronologia, la prima esecuzione della query potrebbe richiedere 60 secondi, ma la seconda esecuzione della query potrebbe richiedere solo 30 secondi se è stata identificata un'ottimizzazione basata sulla cronologia. Il processo continua finché non ci sono ulteriori ottimizzazioni da aggiungere.
Di seguito è riportato un esempio di come funzionano le ottimizzazioni basate sulla cronologia con BigQuery:
Conteggio esecuzioni | Tempo utilizzato per lo slot della query | Note |
---|---|---|
1 | 60 | Esecuzione originale. |
2 | 30 | Prima ottimizzazione basata sulla cronologia applicata. |
3 | 20 | È stata applicata l'ottimizzazione basata sulla seconda cronologia. |
4 | 21 | Nessuna ulteriore ottimizzazione basata sulla cronologia da applicare. |
5 | 19 | Nessuna ulteriore ottimizzazione basata sulla cronologia da applicare. |
6 | 20 | Nessuna ulteriore ottimizzazione basata sulla cronologia da applicare. |
Le ottimizzazioni basate sulla cronologia vengono applicate solo quando c'è un'alta probabilità che ci sarà un impatto positivo sulle prestazioni delle query. Inoltre, quando l'ottimizzazione non migliora significativamente le prestazioni delle query, ma l'ottimizzazione viene revocato e non viene utilizzato nelle esecuzioni future di tale query.
Abilita ottimizzazioni basate sulla cronologia
Per utilizzare le ottimizzazioni basate sulla cronologia in un progetto, includi il seguente parametro
nel
ALTER PROJECT
o
ALTER ORGANIZATION
dichiarazione: default_query_optimizer_options = 'adaptive=on'
Esempio:
ALTER PROJECT `user_project` SET OPTIONS ( `region-us.default_query_optimizer_options` = 'adaptive=on' );
Disattiva le ottimizzazioni basate sulla cronologia
Per disabilitare le ottimizzazioni basate sulla cronologia in un progetto, includi il comando
default_query_optimizer_options = 'adaptive=off'
nel parametro
ALTER PROJECT
o
ALTER ORGANIZATION
l'Informativa.
Esempio:
ALTER PROJECT `user_project` SET OPTIONS ( `region-us.default_query_optimizer_options` = 'adaptive=off' );
Esaminare le ottimizzazioni basate sulla cronologia di un job
Per rivedere le ottimizzazioni basate sulla cronologia per un job, puoi usare una query SQL o una chiamata al metodo API REST.
SQL
Puoi utilizzare una query per ottenere le ottimizzazioni basate sulla cronologia di un job.
La query deve includere INFORMATION_SCHEMA.JOBS_BY_PROJECT
e il nome della colonna query_info.optimization_details
.
Nell'esempio seguente, per un job vengono restituiti i dettagli di ottimizzazione
chiamato sample_job
. Se non sono state applicate ottimizzazioni basate sulla cronologia, NULL
è
prodotto per optimization_details
:
SELECT
job_id,
query_info.optimization_details
FROM `project_name.region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE job_id = 'sample_job'
LIMIT 1;
I risultati sono simili ai seguenti:
-- The JSON in optimization_details has been formatted for readability.
/*------------+-----------------------------------------------------------------*
| job_id | optimization_details |
+------------+-----------------------------------------------------------------+
| sample_job | { |
| | "optimizations": [ |
| | { |
| | "semi_join_reduction": "web_sales.web_date,RIGHT" |
| | }, |
| | { |
| | "semi_join_reduction": "catalog_sales.catalog_date,RIGHT" |
| | }, |
| | { |
| | "semi_join_reduction": "store_sales.store_date,RIGHT" |
| | }, |
| | { |
| | "join_commutation": "web_returns.web_item" |
| | }, |
| | { |
| | "parallelism_adjustment": "applied" |
| | }, |
| | ] |
| | } |
*------------+-----------------------------------------------------------------*/
API
Per ottenere i dettagli di ottimizzazione per un job, puoi chiamare il metodo
Metodo jobs.get
.
Nell'esempio seguente, il metodo jobs.get
restituisce i dettagli dell'ottimizzazione
(optimizationDetails
)
nella risposta completa:
{
"jobReference": {
"projectId": "myProject",
"jobId": "sample_job"
}
}
I risultati sono simili ai seguenti:
-- The unrelated parts in the full response have been removed.
{
"jobReference": {
"projectId": "myProject",
"jobId": "sample_job",
"location": "US"
},
"statistics": {
"query": {
"queryInfo": {
"optimizationDetails": {
"optimizations": [
{
"semi_join_reduction": "web_sales.web_date,RIGHT"
},
{
"semi_join_reduction": "catalog_sales.catalog_date,RIGHT"
},
{
"semi_join_reduction": "store_sales.store_date,RIGHT"
},
{
"join_commutation": "web_returns.web_item"
},
{
"parallelism_adjustment": "applied"
}
]
}
}
}
}
}
Impatto stimato delle ottimizzazioni basate sulla cronologia
Per stimare l'impatto delle ottimizzazioni basate sulla cronologia, puoi utilizzare seguente query SQL di esempio per identificare le query di progetto con il miglioramento stimato in termini di 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,
IFNULL(
ARRAY_LENGTH(JSON_QUERY_ARRAY(query_info.optimization_details.optimizations)) > 0,
FALSE)
AS has_history_based_optimization,
FROM region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE EXTRACT(DATE FROM creation_time) > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
),
most_recent_jobs_without_history_based_optimizations AS (
SELECT *
FROM jobs
WHERE NOT has_history_based_optimization
QUALIFY ROW_NUMBER() OVER (PARTITION BY query_hash ORDER BY end_time DESC) = 1
)
SELECT
job.job_id,
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_history_based_optimizations AS original_job
USING (query_hash)
WHERE
job.has_history_based_optimization
AND original_job.end_time < job.start_time
ORDER BY percent_execution_time_saved DESC
LIMIT 10;
Il risultato della query precedente è simile al seguente, se basato sulla cronologia ottimizzazioni sono state applicate:
/*--------------+------------------------------+------------------+-----------------------*
| job_id | percent_execution_time_saved | new_execution_ms | original_execution_ms |
+--------------+------------------------------+------------------+-----------------------+
| sample_job1 | 0.6780685018624512 | 7087 | 22014 |
| sample_job2 | 0.6648580041250198 | 10562 | 31515 |
| sample_job3 | 0.63285605271764256 | 97668 | 266021 |
| sample_job4 | 0.611341417268879 | 923384 | 2375823 |
| sample_job5 | 0.5538127208971375 | 1060062 | 2375823 |
| sample_job6 | 0.4539694316803648 | 2324071 | 4256302 |
| sample_job7 | 0.38227031526376026 | 17811 | 28833 |
| sample_job8 | 0.33826608962725113 | 66360 | 100282 |
| sample_job9 | 0.32087813758311606 | 44020 | 64819 |
| sample_job10 | 0.2835641631948354 | 19088 | 26643 |
*--------------+------------------------------+------------------+-----------------------*/
Dettagli
- Si tratta solo di una stima dell'impatto dell'ottimizzazione basato sulla cronologia. Molti fattori possono influenzare le prestazioni delle query, inclusi, a titolo esemplificativo, lo slot disponibilità, variazione dei dati nel tempo, differenze nei valori dei parametri di query e visualizzare o definire le funzioni definite dall'utente.
- Questa query può essere applicata ad altre metriche relative alle prestazioni delle query,
total_slot_ms
etotal_bytes_billed
. Per ulteriori informazioni, consulta lo schema dellaINFORMATION_SCHEMA.JOBS
- Se il risultato di questa query di esempio è vuoto, nessun job ha utilizzato i dati basati sulla cronologia ottimizzazioni o tutte le query sono state ottimizzate più di 30 giorni fa.
Ruoli e autorizzazioni
Per attivare le ottimizzazioni basate sulla cronologia, devi disporre dei autorizzazioni necessarie per creare BigQuery configurazioni predefinite, dopodiché dovrai usare l'istruzione
ALTER PROJECT
per abilitare ottimizzazioni basate sulla cronologia. Dopo l'attivazione ottimizzazioni basate sulla cronologia, tutti i job nel progetto utilizzano ottimizzazioni basate sulla cronologia, indipendentemente dall'utente che ha creato il job. Per saperne di più sulle autorizzazioni necessarie per le configurazioni predefinite, consulta Autorizzazioni obbligatorie per le configurazioni predefinite. Per attivare le ottimizzazioni basate sulla cronologia, consulta: Attiva le ottimizzazioni basate sulla cronologia.Per rivedere le ottimizzazioni basate sulla cronologia per un job utilizzando il
INFORMATION_SCHEMA.JOBS
, devi disporre del ruolo richiesto. Per maggiori informazioni informazioni, consulta Ruolo obbligatorio. perINFORMATION_SCHEMA.JOBS
visualizzazione.