Loading

Domande frequenti sullo strumento Query Plan (Piano di esecuzione delle query) della Developer Console

Data pubblicazione: Aug 30, 2024
Descrizione

Lo strumento Query Plan (Piano di esecuzione delle query) nella Developer Console può favorire un'esecuzione più rapida di query SOQL su ampi volumi. Utilizzare questo strumento per ottimizzare e accelerare le query eseguite su volumi di grandi dimensioni.

 

Abilitazione e utilizzo dello strumento Query Plan

  1. Nella Developer Console, fare clic su Guida | Preferenze
  2. Impostare 'Abilita piano di esecuzione delle query' su TRUE.


Una volta abilitato nella Developer Console, è possibile accedere allo strumento Query Plan Tool nella scheda 'Editor query' della console.

Per utilizzare lo strumento Query Plan, è sufficiente inserire una query In Editor query e premere Query Plan per visualizzare tutte le operazioni di query e il costo di ciascuna per l'SOQL fornito.

 
Risoluzione

Motivi per l'utilizzo dello strumento Query Plan (Piano di esecuzione delle query)

Utilizzare questo strumento per controllare il piano di esecuzione per tutte le query SOQL la cui esecuzione è lenta. Lo strumento fornisce informazioni approfondite sui diversi piani e, se alcuni filtri sono indicizzati, indica il costo dell'utilizzo dell'indice rispetto all'analisi della tabella completa.

Se il costo dell'analisi della tabella è inferiore a quello dell'indice e la query genera un timeout, è necessario effettuare un'ulteriore analisi per migliorare la selettività utilizzando altri filtri oppure per verificare se nella query è presente un altro filtro selettivo non indicizzato ma candidato a esserlo.
 

Determinare se un filtro è selettivo:

  • Determinare se ha un indice.
  • Se il filtro è impostato su un campo standard, ha un indice se è una chiave primaria (Id, Name, OwnerId), una chiave esterna (CreatedById, LastModifiedById, campo di ricerca, relazione record principale-record dettaglio) o un campo di controllo (CreatedDate, SystemModstamp).
  • I campi personalizzati hanno un indice se sono stati contrassegnati come univoci o come ID esterno.
  • Se il filtro non ha un indice, non viene preso in considerazione per l'ottimizzazione.
  • Se il filtro ha un indice, determinare quanti record può restituire:
  • Per un indice standard, la soglia è il 30% del primo milione di record di destinazione e il 15% di tutti i record dopo il primo milione. Inoltre, la soglia di selettività per un indice standard viene raggiunta in corrispondenza di 1 milione di record di destinazione, raggiungibile solo se sono disponibili più di 5,6 milioni di record in totale.
  • Per un indice personalizzato, la soglia di selettività è il 10% del primo milione di record di destinazione e il 5% di tutti i record dopo il primo milione. Inoltre, la soglia di selettività per un indice personalizzato viene raggiunta in corrispondenza di 333.333 milioni di record di destinazione, raggiungibili solo se sono disponibili più di 5,6 milioni di record.
  • Se il filtro supera la soglia, non viene preso in considerazione per l'ottimizzazione.
  • Se il filtro non supera la soglia, È selettivo e verrà preso in considerazione dal Query Optimizer per l'ottimizzazione.
 

Che cosa significa?

Lo strumento Query Plan visualizza un elenco di piani disponibili utilizzabile dal Query Optimizer per la query fornita, in ordine crescente di costo.

Ciascun piano contiene informazioni relative, tra l'altro, a cardinalità, tipo di operazione, costo e tipo di sObject. Per ciascun piano è indicato un tipo di operazione principale, ad esempio indicizzazione campo o analisi tabella completa. Il piano con il costo più basso è quello utilizzato per l'esecuzione della query.

 
Cardinalità
Campi
Tipo di operazione principale
Costo
Cardinalità sObject
Tipo di sObject
Numero stimato di record restituiti dal tipo di operazione principale.
Ad esempio, numero di record restituiti se si utilizza una tabella di indici.
 
Campo o campi indicizzati utilizzati dal Query Optimizer. Se il tipo di operazione principale corrisponde a Indice, il valore del campo è Indice. In caso contrario, il valore del campo è null.
Tipo di operazione principale utilizzato da Salesforce per ottimizzare la query.
  • Indice - La query utilizzerà un indice per l'oggetto interessato.
  • Condivisione - La query utilizzerà un indice in base alle regole di condivisione associate all'utente che esegue la query. Se sono presenti regole di condivisione che limitano i record a cui l'utente ha accesso, possono essere utilizzate da Salesforce per ottimizzare la query.
  • TableScan - La query analizzerà tutti i record per l'oggetto interessato.
  • Altro - La query utilizzerà le ottimizzazioni interne di Salesforce.
Costo della query rispetto alla soglia di selettività del Query Optimizer di Force.com. I valori maggiori di 1 indicano che la query non sarà selettiva.
Numero approssimativo di record per l'oggetto sottoposto a query.
Nome dell'oggetto sottoposto a query.
 

 

Come viene determinato il costo?

Per ciascun piano è stabilito un valore di costo. Questo valore deriva dalle statistiche del database (DB) sulla tabella e sui valori raccolte più di recente. Il piano utilizzato sarà quello con il costo più basso. Se il costo è maggiore di 1 significa che la query non sarà selettiva.

 

Il campo indicizzato non compare nell'elenco di piani

Se la query fornita contiene un campo indicizzato nei filtri, il piano per questo campo viene visualizzato solo se si utilizza un'operazione supportata per tale campo.

Ecco un elenco di operazioni non supportate:

  • L'indice personalizzato non viene mai utilizzato se vengono effettuati confronti con un operatore come "NOT EQUAL TO"
  • L'indice personalizzato non viene mai utilizzato se vengono effettuati confronti con un valore null come "Name = ''"
  • I caratteri jolly '%' iniziali sono operatori inefficienti che rendono le condizioni di filtro non selettive
  • Quando si utilizza un confronto OR, tutti i filtri devono essere indicizzati e al di sotto della soglia del 10%. . Se è presente un campo non indicizzato o al di sopra del 10%, il piano non verrà visualizzato.

 

Lo strumento Query Plan visualizza i candidati indici o i campi che possono essere indicizzati?

Lo strumento Query Plan visualizza solo le statistiche dei campi indicizzati nella sezione del piano, non i campi che possono essere indicizzati. Questo strumento non fornisce informazioni sui campi che possono essere indicizzati.

Consultare How to make my SOQL query selective (Come rendere selettive le proprie query SOQL) per determinare quali campi possono essere indicizzati.

 

Esempi e interpretazioni dei risultati di Query Plan 

Nei seguenti esempi sono utilizzati 2 campi indicizzati. Una casella di controllo (InActiveAcc__c) e un elenco di selezione (Account_Hierarchy__c) per l'sObject Account.

Nota: sono disponibili altre query di esempio nel post originale sul parametro relativo al feedback delle risorse di query di cui questo nuovo strumento della Developer Console rappresenta l'evoluzione.

 

Query di esempio 1

SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Parent'


Scenario: un campo indicizzato con una variabile di binding selettiva

Il campo "Account_Hierarchy__c" è indicizzato, quindi è stato preso in considerazione per un piano con tipo di operazione principale corrispondente a "Indice". Il campo indicizzato ha un costo inferiore rispetto a TableScan, quindi Query Optimizer utilizzerà l'indice per questa query sull'oggetto Account di 50.088 righe.

 

Query di esempio 2

SELECT count() FROM Account WHERE InActiveAcc__c = true AND Account_Hierarchy__c = 'Parent'


Scenario: 2 campi indicizzati, 1 selettivo

Che cosa succede se più filtri semplici sono selettivi? Se vengono rilevati più filtri selettivi, per il piano di esecuzione della query, Query Optimizer sceglie quello con il costo minore.

 

Query di esempio 3

SELECT count() FROM Account WHERE InActiveAcc__c = true AND Account_Hierarchy__c != 'Parent' **NOTA: Uso di un'operazione non supportata per l'indice**


Scenario: 2 campi indicizzati, 1 selettivo MA che utilizza un'operazione non supportata

L'indice per Account_Hierarchy__c non viene utilizzato né preso in considerazione a causa dell'operazione non supportata "!=". Si noti inoltre che verrà utilizzato InActiveAcc__c, che però ha un costo maggiore di 1. Come affermato in precedenza, il filtro non è selettivo ma verrà utilizzato.

 

Query di esempio 4

SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Child'


Scenario: 1 campo indicizzato che utilizza una variabile di binding non selettiva (>10% del numero di righe dell'sObject)

In questo caso, il costo del campo indicizzato Account_Hierarchy__c mostrato è molto più alto di quello di un'analisi della tabella completa. Il motivo è che l'indice non è selettivo e la variabile di binding "Child" ha come risultato più del 10% della tabella completa. Il DB eseguirà un'analisi della tabella completa per la query, le cui prestazioni, a seconda della dimensione della tabella, potranno essere insoddisfacenti.
Numero articolo Knowledge

000386864

 
Caricamento
Salesforce Help | Article