Loading

Miglioramento delle prestazioni delle query SOQL tramite un indice personalizzato

Data pubblicazione: Apr 6, 2021
Descrizione

Per garantire le migliori prestazioni, le query SOQL devono essere selettive, soprattutto le query all'interno di trigger. Per evitare tempi di esecuzione prolungati, le query SOQL non selettive possono essere terminate dal sistema. Gli sviluppatori ricevono un messaggio di errore quando una query non selettiva in un trigger viene eseguita su un oggetto che contiene più di 200.000 record. Di seguito sono disponibili le informazioni su come evitare questo errore e rendere selettiva la query. 
Risoluzione

Nota importante: 

Anche se è stato dedicato il massimo impegno a far sì che questo articolo descriva il funzionamento di Query Optimizer di Salesforce SOQL ad alto livello, il suo comportamento può cambiare senza preavviso per consentire ulteriori miglioramenti delle prestazioni. Si consiglia agli sviluppatori di utilizzare la visualizzazione Query Plan (Piano di esecuzione delle query) (disponibile dal rilascio Summer ‘14) nella Developer Console, che consente di ottimizzare le query non selettive in base alle informazioni fornite da Query Optimizer al momento della generazione del piano di esecuzione per la query SOQL interessata.

Inoltre, gli indici possono comportare un aumento del costo DML e/o, in alcuni casi, Query Optimizer deve adottare modalità di esecuzione diverse in base agli indici, e questo può influire sulle prestazioni.



Criteri delle query SOQL selettive


Una query è selettiva se uno dei suoi filtri si basa su un campo indicizzato e mantiene il numero di righe risultante al di sotto di una soglia definita dal sistema. Le prestazioni della query SOQL migliorano quando due o più filtri utilizzati nella clausola WHERE soddisfano le condizioni citate.

La soglia di selettività corrisponde al 10% dei record per il primo milione di record e a meno del 5% dei record dopo il primo milione, fino a un massimo di 333.000 record. In alcune circostanze la soglia può essere superiore, ad esempio nel caso di un filtro di query corrispondente a un campo standard indicizzato. Inoltre, la soglia di selettività è soggetta a modifiche.



Considerazioni sugli indici personalizzati per le query SOQL selettive

I seguenti campi sono indicizzati per impostazione predefinita:
  • Chiavi primarie (campi relativi a ID, nome e proprietario).
  • Chiavi esterne (campi di ricerca o di relazioni record principale-record dettaglio).
  • Date di controllo (ad esempio SystemModStamp). 
  • Campi personalizzati contrassegnati come ID esterno o univoci.
       

L'Assistenza Salesforce può aggiungere indici personalizzati su richiesta del cliente

Al momento della creazione di un caso con l'assistenza, assicurarsi di includere la query SOQL contenente il campo da indicizzare come filtro nella clausola WHERE. Assicurarsi inoltre di includere eventuali valori di binding. 
Vedere l'elenco di controllo in Make SOQL query selective (Come rendere selettive le query SOQL) prima di creare un caso di assistenza.
In questo articolo è inoltre descritto come determinare i campi indicizzabili . A tale scopo è anche possibile eseguire un'analisi del piano di esecuzione delle query nella Developer Console come indicato qui: Strumento Query Plan (Piano di esecuzione delle query)
Un indice personalizzato per i valori di campi casella di controllo che si verificano con meno frequenza offre i vantaggi maggiori in termini di prestazioni e in genere indica una query selettiva.  

Non è possibile creare un indice personalizzato per questi tipi di campi:
  • Elenchi di selezione a selezione multipla.
  • Campi valuta in un'organizzazione con più valute.
  • Campi di testo lungo. 
  • Campi binari (campi di tipo blob, file o testo crittografato). 
Nota: è possibile aggiungere a Salesforce nuovi tipi di dati, in genere complessi, e i campi corrispondenti potrebbero non consentire l'indicizzazione personalizzata.
       

Gli indici personalizzati non vengono solitamente utilizzati in questi casi:
  • Quando i valori oggetto di query superano la soglia definita dal sistema citata in precedenza.
  • Quando l'operatore di filtro è negativo, ad esempio NOT EQUAL TO (!=), NOT CONTAINS e NOT STARTS WITH.
  • Quando nel filtro è utilizzato l'operatore CONTAINS e il numero di righe da analizzare supera 333.000. Questo perché l'operatore CONTAINS richiede l'analisi completa dell'indice. Si noti che questa soglia è soggetta a modifiche.
  • Quando si esegue un confronto con un valore vuoto (Name != '').
Nota: esistono altri scenari complessi in cui gli indici personalizzati non sono utilizzati. Contattare il rappresentante Salesforce se il proprio scenario non rientra in questi casi o se è necessaria ulteriore assistenza per l'esecuzione di query non selettive.



Esempi di query SOQL selettive

Per capire meglio se una query su un oggetto grande è selettiva o meno, si analizzeranno ora alcune query. Per queste query si presume che siano presenti più di 200.000 record (compresi i record eliminati non definitivamente, ovvero record eliminati ancora presenti nel Cestino) per l'sObject Account.


Query 1:

SELECT Id FROM Account WHERE Id IN (<elenco di ID account>)
La clausola WHERE interessa un campo indicizzato (Id). Se SELECT COUNT() FROM Account WHERE Id IN (<elenco di ID account>) restituisce un numero di record inferiore rispetto alla soglia di selettività, l'indice su Id viene utilizzato. In questo caso, questa condizione viene soddisfatta, poiché l'elenco di ID contiene solo un ridotto numero di record.


Query 2:

SELECT Id FROM Account WHERE Name != ''
Dato che Account è un oggetto grande anche se Nome è indicizzato (chiave primaria), questo filtro restituisce la maggior parte dei record, rendendo la query non selettiva.
 

Query 3:

SELECT Id FROM Account WHERE Name != '' AND CustomField__c = 'ValueA'
Qui è necessario esaminare ciascun filtro singolarmente per capire se è selettivo o meno. Come si è visto nell'esempio precedente, il primo filtro non è selettivo. Quindi l'attenzione sarà concentrata sul secondo. Se il numero di record restituito da SELECT COUNT() FROM Account WHERE CustomField__c = 'ValueA' è inferiore alla soglia di selettività e CustomField__c è indicizzato, la query è selettiva.

Query 4:

SELECT Id FROM Account WHERE FormulaField__c = 'ValueA'
Per indicizzare un campo formula, devono essere soddisfatte le seguenti regole:
  • La formula contiene campi solo di un oggetto singolo (non campi di relazioni).
  • Il campo formula non fa riferimento ad alcuna funzione non deterministica (ad esempio SYSDATE).
  • Il campo formula non fa riferimento a campi non supportati per l'inclusione in indici. L'elenco di questi campi non è documentato specificamente in alcun punto (esistono molti casi speciali), ma nel rilascio Spring ‘12 (176) createdById non era supportato, mentre nel rilascio Summer ‘12 (178) lo è. Un caso analogo è CreatedDate.
  • Il campo formula non contiene riferimenti a chiavi primarie (ad esempio Id). 
  • Il campo formula non utilizza la funzione TEXT(<campo-elenco-selezione>)
  • Se la formula fa riferimento a campi di ricerca, l'opzione "Che cosa fare se il record di ricerca viene eliminato?" del campo non deve essere impostata su "Cancellare il valore di questo campo".

 

Nota: le prestazioni della query SOQL verranno analizzate dall'Assistenza Salesforce. Se la query rispetta i criteri, l'indice verrà creato.

Numero articolo Knowledge

000385213

 
Caricamento
Salesforce Help | Article