Comprendere le prestazioni delle query utilizzando Query Explain

Query Explain ti consente di inviare query Firestore al e ricevere statistiche dettagliate sulle prestazioni nell'esecuzione delle query al backend in cambio. Funziona come l'operazione EXPLAIN [ANALYZE] in molte sistemi di database relazionale.

Le richieste Query Explain possono essere inviate utilizzando le librerie client di Firestore.

I risultati di Query Explain ti aiutano a capire come vengono eseguiti, mostrando le inefficienze e la posizione di probabilmente colli di bottiglia.

Spiegazione della query:

  • Fornisce insight sulla fase di pianificazione delle query per consentirti di modificare la query indici e di aumentare l'efficienza.
  • L'opzione di analisi ti aiuta a comprendere costi e rendimento su in base alle singole query e ti consente di eseguire rapidamente l'iterazione attraverso diverse query pattern al fine di ottimizzarne l'uso.

Comprendere le opzioni di Query Explain: predefinite e analisi

Le operazioni di Query Explain possono essere eseguite utilizzando l'opzione default oppure analyze.

Con l'opzione predefinita, Query Explain pianifica la query, ma ignora durante la fase di esecuzione. Verranno restituite le informazioni sulla fase dello strumento di pianificazione. Puoi utilizzalo per verificare che una query abbia gli indici necessari e capire quali di Google Cloud. Questo ti aiuterà a verificare, ad esempio, che un particolare query sta usando un indice composto anziché doversi incrociare su molte indici di appartenenza.

Con l'opzione di analisi, Query Spiega sia i piani sia l'esecuzione query. Verranno restituite tutte le informazioni sul planner menzionate in precedenza insieme le statistiche del runtime di esecuzione della query. Saranno incluse le informazioni di fatturazione informazioni sulla query oltre a insight a livello di sistema sulla query dell'esecuzione. Puoi utilizzare questi strumenti per testare vari tipi di query configurazioni per ottimizzare costi e latenza.

Quanto costa Query Explain?

Quando utilizzi Query Explain con l'opzione predefinita, nessuna operazione di indice o di lettura in esecuzione. Indipendentemente dalla complessità della query, viene addebitata un'operazione di lettura.

Quando utilizzi Query Explain con l'opzione di analisi, le operazioni di indicizzazione e lettura vengono eseguiti, quindi la query ti viene addebitata come di consueto. Non sono richieste per l'attività di analisi, mentre il normale addebito per la query eseguito.

Utilizza Query Explain con l'opzione predefinita

Puoi utilizzare le librerie client per inviare una richiesta di opzioni predefinita.

Tieni presente che le richieste vengono autenticate con IAM utilizzando lo stesso autorizzazioni per le normali operazioni di query. Altre tecniche di autenticazione, come Firebase Authentication vengono ignorati. Per ulteriori informazioni, consulta la guida IAM per le librerie client del server.

Java (amministratore)

Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();

    
Nodo (amministratore)

const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;

    

Il formato esatto della risposta dipende dall'ambiente di esecuzione. I risultati restituiti possono essere convertiti in JSON. Ad esempio:

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

Per ulteriori informazioni, consulta la documentazione di riferimento per il report di spiegazione delle query.

Utilizzare Query Explain con l'opzione Analizza

Puoi utilizzare le librerie client per inviare una richiesta di opzione di analisi.

Tieni presente che le richieste vengono autenticate con IAM utilizzando lo stesso autorizzazioni per le normali operazioni di query. Altre tecniche di autenticazione, come Firebase Authentication vengono ignorati. Per ulteriori informazioni, consulta la guida IAM per le librerie client del server.

Java (amministratore)

Query q = db.collection("col").whereGreaterThan("a", 1);

ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();

ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();

    
Nodo (amministratore)

const q = db.collection('col').where('country', '=', 'USA');

const options = { analyze : 'true' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;

    

L'esempio seguente mostra l'oggetto stats restituito oltre a planInfo. Il formato esatto della risposta dipende dall'ambiente di esecuzione. La la risposta di esempio è in formato JSON.

{
    "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 ulteriori informazioni, consulta la documentazione di riferimento per il report di spiegazione delle query.

Interpretare i risultati e apportare le modifiche

Osserviamo uno scenario di esempio in cui eseguiamo query sui film per genere e paese di produzione.

Ad esempio, supponiamo che l'equivalente di questa query SQL.

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

Se utilizziamo l'opzione di analisi, le metriche restituite mostrano la query viene eseguito su due indici a campo singolo, (category ASC, __name__ ASC) e (country ASC, __name__ ASC). Analizza 16.500 voci di indice, ma restituisce solo 1200 documenti.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "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 dell'esecuzione della query, puoi creare una indice composto completamente coperto (category ASC, country ASC, __name__ ASC).

Eseguendo di nuovo la query con l'opzione Analizza, vediamo che per questa query viene selezionato un indice appena creato, che viene eseguita molto più velocemente in modo più efficiente.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "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",
               }
    }
}