Query Explain ti consente di inviare query in modalità Datastore al backend e ricevere in cambio statistiche dettagliate sulle prestazioni dell'esecuzione delle query di backend. Funziona come l'operazione EXPLAIN ANALYZE
in molti
sistemi di database relazionali.
Puoi inviare richieste di spiegazione delle query utilizzando le librerie client della modalità Datastore.
I risultati di Query Explain ti aiutano a capire come vengono eseguite le query, mostrandoti le inefficienze e la posizione dei probabili colli di bottiglia lato server.
Query Explain:
- Fornisce informazioni sulla fase di pianificazione per consentirti di modificare gli indici delle query e aumentare l'efficienza.
- Ti aiuta a comprendere i costi e il rendimento in base alle query e ti consente di scorrere rapidamente diversi pattern di query per ottimizzarne l'utilizzo.
Comprendere le opzioni di spiegazione delle query: predefinita e analizza
Le operazioni Query Explain possono essere eseguite utilizzando l'opzione predefinita o l'opzione analizza.
Con l'opzione predefinita, Query Explain pianifica la query, ma salta la fase di esecuzione. Verranno restituite le informazioni sulla fase di pianificazione. Puoi utilizzarlo per verificare che una query abbia gli indici necessari e capire quali indici vengono utilizzati. In questo modo, ad esempio, puoi verificare che una determinata query utilizzi un indice composto anziché dover intersecare molti indici diversi.
Con l'opzione di analisi, Query Explain pianifica ed esegue la query. Vengono restituite tutte le informazioni sul planner menzionate in precedenza, insieme alle statistiche del runtime di esecuzione della query. Questi includeranno i dati di fatturazione e gli approfondimenti a livello di sistema sull'esecuzione della query. Puoi utilizzare questi strumenti per testare varie configurazioni di query e indici per ottimizzare i costi e la latenza.
Quanto costa Query Explain?
Quando una query viene spiegata con l'opzione predefinita, non vengono eseguite operazioni di indice o di lettura. Indipendentemente dalla complessità della query, viene addebitata un'operazione di lettura.
Quando una query viene spiegata con l'opzione di analisi, vengono eseguite operazioni di indicizzazione e lettura, pertanto ti viene addebitato il costo della query come di consueto. Non sono previsti costi aggiuntivi per l'attività di analisi, ma solo l'addebito consueto per l'esecuzione della query.
Esegui una query con l'opzione predefinita
Puoi utilizzare una libreria client per inviare una richiesta di opzione predefinita.
Tieni presente che i risultati di spiegazione delle query vengono autenticati con Identity and Access Management, utilizzando le stesse autorizzazioni per le normali operazioni di query.
Java
Per scoprire come installare e utilizzare la libreria client per la modalità Datastore, consulta la pagina Librerie client della modalità Datastore. Per saperne di più, consulta la documentazione di riferimento dell'API Java in modalità Datastore.
Per eseguire l'autenticazione in modalità Datastore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Consulta il campo indexes_used
nella risposta per scoprire gli indici
utilizzati nel piano di query:
"indexes_used": [ {"query_scope": "Collection Group", "properties": "(__name__ ASC)"}, ]
Per saperne di più sul report, consulta il riferimento al report.
Esegui una query con l'opzione di analisi
Puoi utilizzare una libreria client per inviare una richiesta di opzione predefinita.
Tieni presente che i risultati dell'analisi delle query vengono autenticati con Identity and Access Management (IAM), utilizzando le stesse autorizzazioni per le normali operazioni di query.
Java
Per scoprire come installare e utilizzare la libreria client per la modalità Datastore, consulta la pagina Librerie client della modalità Datastore. Per saperne di più, consulta la documentazione di riferimento dell'API Java in modalità Datastore.
Per eseguire l'autenticazione in modalità Datastore, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Consulta l'oggetto executionStats
per trovare informazioni sulla profilazione delle query, ad esempio:
{ "resultsReturned": "5", "executionDuration": "0.100718s", "readOperations": "5", "debugStats": { "index_entries_scanned": "95000", "documents_scanned": "5" "billing_details": { "documents_billable": "5", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
Per saperne di più sul report, consulta il riferimento al report.
Interpretare i risultati e apportare modifiche
Il seguente scenario di esempio esegue query sui film per genere e paese di produzione e mostra come ottimizzare gli indici utilizzati dalla query.
Per saperne di più sul report, consulta il riferimento al report Query Explain.
A titolo illustrativo, supponiamo l'equivalente di questa query SQL.
SELECT * FROM movies WHERE category = 'Romantic' AND country = 'USA';
Se utilizziamo l'opzione di analisi, il seguente output del report mostra
che la query viene eseguita su indici a campo singolo (category ASC, __name__ ASC)
e
(country ASC, __name__ ASC)
. Esegue la scansione di 16.500 voci di indice, ma restituisce
solo 1200 documenti.
// Output query planning info "indexes_used": [ {"query_scope": "Collection Group", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection Group", "properties": "(country ASC, __name__ ASC)"}, ] // Output query status { "resultsReturned": "1200", "executionDuration": "0.118882s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "16500", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
Per ottimizzare le prestazioni di esecuzione della query, puoi creare un indice composito completamente coperto (category ASC, country ASC, __name__ ASC).
Se eseguiamo di nuovo la query in modalità di analisi, possiamo vedere che l'indice appena creato è selezionato per questa query e che la query viene eseguita in modo molto più rapido ed efficiente.
// Output query planning info "indexes_used": [ {"query_scope": "Collection Group", "properties": "(category ASC, country ASC, __name__ ASC)"} ] // Output query stats { "resultsReturned": "1200", "executionDuration": "0.026139s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "1200", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }