Ottimizzare le prestazioni delle query
Per risolvere i problemi relativi alle query lente, utilizza Spiega query per ottenere il piano di esecuzione della query e il profilo di esecuzione in fase di runtime. La sezione seguente descrive i passaggi che puoi svolgere per ottimizzare le prestazioni delle query in base al profilo di esecuzione:Limita il numero di risultati
Utilizza il campo Record restituiti nell'albero di esecuzione per identificare se la query restituisce molti documenti. Valuta la possibilità di limitare il numero di documenti restituiti utilizzando la clausola $limit
. In questo modo vengono ridotte le dimensioni in byte dei risultati serializzati quando vengono restituiti ai client tramite la rete. Nei casi in cui il nodo Limit
è preceduto da un nodo MajorSort
, il motore di query può unire i nodi Limit
e MajorSort
e sostituire una materializzazione e una ordinamento in-memory completa con un ordinamento TopN, riducendo il requisito di memoria per la query.
Limitare le dimensioni del documento del risultato
Valuta la possibilità di limitare le dimensioni del documento restituito utilizzando la clausola $project
per evitare di recuperare campi non necessari. In questo modo si riducono i costi di calcolo e memoria per l'elaborazione
risultati intermedi e le dimensioni in byte serializzati dei risultati quando vengono restituiti
ai client tramite la rete. Se tutti i campi a cui viene fatto riferimento nella query sono coperti da un indice normale (non multikey), la query viene coperta completamente dalla scansione dell'indice, evitando la necessità di recuperare i documenti dallo spazio di archiviazione principale.
Utilizzare gli indici
Segui le istruzioni riportate di seguito per configurare e ottimizzare gli indici.
Identificare se la query utilizza un indice
Puoi identificare se la query utilizza un indice controllando i nodi fogli nell'albero di esecuzione. Se il nodo foglia dell'albero di esecuzione è un nodo TableScan, significa che la query non utilizza un indice e sta eseguendo la scansione dei documenti dall'archiviazione primaria. Se viene utilizzato un indice, il nodo foglia dell'albero di esecuzione mostrerà l'ID indice e i campi indice dell'indice.
Identifica se l'indice utilizzato può essere ottimizzato
Un indice è utile per una query se può ridurre il numero di documenti che il motore di query deve recuperare dallo spazio di archiviazione principale o se l'ordinamento dei campi può soddisfare il requisito di ordinamento della query.
Se viene utilizzato un indice per una query, ma il motore di query continua a recuperare e eliminare molti documenti, come identificato da un nodo Scan che restituisce molti record seguito da un Nodo filtro che restituisce pochi record, è un segno che Il predicato della query soddisfatto utilizzando l'indice non è selettivo. Per creare un indice più adatto, consulta Creare indici.
Se per una query viene utilizzato un indice non multichiave, ma il motore di query sta ancora eseguendo un riordinamento in memoria del set di risultati, come identificato da un Nodo di ordinamento principale nell'albero di esecuzione della query, significa che l'indice utilizzato non può essere utilizzato per soddisfare il requisito di ordinamento della query. Per creare un indice più adatto, consulta la sezione successiva.
Crea indici
Segui la documentazione sulla gestione degli indici per creare gli indici. Per assicurarti che la query possa utilizzare gli indici, crea indici regolari (non multikey) con i campi nell'ordine seguente:
- Tutti i campi che verranno utilizzati negli operatori di uguaglianza. Per massimizzare le probabilità di riutilizzo tra le query, ordina i campi in ordine decrescente di occorrenza dei campi negli operatori di uguaglianza tra le query.
- Tutti i campi in base ai quali verrà eseguita l'ordinamento (nello stesso ordine).
- Campi che verranno utilizzati negli operatori di intervallo o di disuguaglianza in ordine decrescente di selettivotà dei vincoli di query.
- Campi che verranno restituiti nell'ambito di una query nell'indice: l'inclusione di questi campi nell'indice consente all'indice di coprire la query ed evitare di dover recuperare il documento dallo spazio di archiviazione principale.
Per le query che prevedono il filtro e l'ordinamento dei campi array, valuta la possibilità di creare indici multikey.
Utilizzare il suggerimento di query
Se hai creato un indice più adatto per la query, ma il motore delle query non lo utilizza, puoi ignorare la preferenza di indice del motore delle query utilizzando un suggerimento di query.