Salesforce ritirerà e non supporterà più la funzione Async SOQL dei Big Objects con il rilascio Summer ‘23.
Il ritiro di Async SOQL rientra nel nostro impegno per un continuo miglioramento della Salesforce Platform, la cui evoluzione prevede l'allontanamento dalle tecnologie che supportano Async SOQL. Questa funzione verrà sostituita da API più familiari ai clienti.
Che cosa comporta per me questa modifica?
Una volta eseguito l'aggiornamento dell'organizzazione al rilascio Summer ‘23, sarà necessario utilizzare l'API in blocco o batch Apex per eseguire query o rapporti su Big Objects personalizzati. Dopo l'implementazione del rilascio, i processi che eseguono Async SOQL non saranno più disponibili. Si consiglia di testare la sostituzione di Async SOQL nelle organizzazioni Sandbox prima del rilascio Summer ‘23. Accedere al sito Salesforce Trust per pianificare l'aggiornamento della propria organizzazione.
CRM Analytics riesce ancora a caricare dati da BigObjects?
Sì, CRM Analytics utilizza le richieste API in blocco per caricare i dati.
Quale metodo devo utilizzare per eseguire query per più di 50 mila record?
Sia l'API in blocco sia batch Apex sono in grado di restituire risultati per volumi superiori a 50 mila query. Tuttavia, Salesforce suggerisce di utilizzare batch Apex attivando ulteriori processi batch Apex.
Che cosa devo fare se mi trovo a gestire milioni di record e si verifica il timeout delle mie query in blocco o Apex?
Per eseguire query in modo più efficiente su un volume di record elevato, è possibile aggiornare l'indice includendo i campi da interrogare, oppure modificare le modalità di archiviazione dei dati in Big Objects. Se si suddividono i dati in Big Objects separati, si può utilizzare Async SOQL per eseguire la migrazione dei dati in questi nuovi oggetti. Se si intende utilizzare Async SOQL per la migrazione dei dati, assicurarsi di effettuarla prima che venga ritirato con il rilascio Summer ‘23.
E se decido di abbandonare Big Objects e non utilizzarlo per la migrazione?
Se si esegue la migrazione con un'altra soluzione, si può utilizzare Database.deleteImmediate per eliminare i dati. Salesforce non esegue l'eliminazione dei dati. È un'operazione che deve essere eseguita dagli utenti.
Quali sono le alternative ad Async SOQL e come posso utilizzarle?
Per eseguire le query in Big Objects si può utilizzare l'API in blocco e batch Apex. Esaminare i seguenti esempi di alternative a query Async SOQL esistenti.
Itinerario di controllo dei campi
Questo esempio mostra come eseguire una query in FieldHistoryArchive e analizzare i risultati in un file CSV.
Esempio di URI
/services/data/vXX.X/jobs/query
Esempio di richiesta POST
{ "operation": "query", "query": "SELECT ParentId, FieldHistoryType, Field, Id, NewValue, OldValueFROM FieldHistoryArchive WHERE FieldHistoryType = ‘Account’ AND CreatedDate > LAST_MONTH" }
Utilizzare la risorsa Get Results for a Query Job (Come ottenere risultati per un processo di query).
Esempio di richiesta CURL
curl --include --request GET \ --header "Autorizzazione: token Bearer" \ --header "Accept: text/csv" \ https://instance.salesforce.com/services/data/vXX.X/jobs/query/750R0000000zxr8IAA/results ?maxRecords=50000
Questa richiesta restituisce i risultati sotto forma di un file CSV da esaminare a scopo di controllo.
Vista Customer 360
Batch Apex rappresenta un'alternativa ad Async SOQL per l'elaborazione automatizzata di un Big Object o ApiEvent, ReportEvent o ListViewEvent. Questo esempio mostra come aggiungere un processo di elaborazione che fa riferimento a dati correlati.
Eseguire una query batch Apex su un Big Object, quindi correlare le informazioni di contatto associate a tale Big Object.
Nota: in Apex non è possibile eseguire query su un numero illimitato di Big Objects. L'heap Apex ha un limite di 6 MB per i processi di sincronizzazione e di 12 MB per i processi asincroni. Ad esempio, se si dispone di 6.000 voci da 1 KB l'una, si potranno salvare nella memoria solo 6.000 record.
public class QueryBigObjectAndContact implements Database.Batchable<sObject> { private String key; public QueryBigObjectAndContact(String keyParam) { key = keyParam } public Iterable<SObject> start(Database.BatchableContext BC) { return [SELECT Big_Object_Field__c, Account__c FROM Big_Object__b WHERE Big_Object_Primary_Key__c > key LIMIT 50000] } public void execute(Database.BatchableContext bc, List<Big_Object__b> bos){ // elaborare il batch di Big Objects e associarli agli account Map<Id, Big_Object__b> accountIdToBigObjectMap = new Map<Id, Big_Object__b>(); for (Big_Object__b bigObject : bos) { accountIdToBigObjectMap.put(bigObject.Account__c, bigObject); key = bigObject.Big_Object_Primary_Key__c } Map<Id, Account> = new Map<Id, Account>( [SELECT Id, Name, ... FROM Account WHERE Id IN :accountIdToBigObjectMap.keySet()] ); for (Id accountId : accountMap.keySet()) { Big_Object__b bigObject = accountIdToBigObjectMap.get(accountId); Account account = accountMap.get(accountId); // eseguire qualsiasi azione che consenta di integrare il Big Object e l'account } } public void finish(Database.BatchableContext bc){ // Concatenare altre chiamate utilizzando la chiave principale del Big Object per ovviare al limite governor di 50 mila unità QueryBigObjectAndContact nextBatch = new QueryBigObjectAndContact(key); Database.executeBatch(nextBatch); } }
Monitoraggio evento in tempo reale
Questo esempio mostra come eseguire query e analizzare un Big Object evento utilizzando il contenuto di un campo.
public class EventMatchesObject implements Database.Batchable<sObject> { private String lastEventDate; public EventMatchesObject(String lastEventDateParam) { lastEventDate = lastEventDateParam; } public Iterable<SObject> start(Database.BatchableContext bc) { return [SELECT EventDate, EventIdentifier, QueriedEntities, SourceIp, Username, UserAgent FROM ApiEvent WHERE EventDate > lastEventDate LIMIT 50000] } public void execute(Database.BatchableContext bc, List<ApiEvent> events){ // Elaborare questo elenco di entità se un determinato attributo corrisponde for (ApiEvent event: events) { String objectString = 'Patent__c'; String eventIdentifier = event.EventIdentifier; if (eventIdentifier.contains(objectString) { // Eseguire azioni sull'evento che contiene 'Patent__c' } lastEventDate = format(event.EventDate); } } public void finish(Database.BatchableContext bc){ // Concatenare altre chiamate utilizzando EventDate o altri campi filtro per ovviare al limite governor di 50 mila unità EventMatchesObject nextBatch = new EventMatchesObject(lastEventDate); Database.executeBatch(nextBatch); } }
Query aggregate
Questo esempio mostra un'alternativa per le query aggregate simile al metodo COUNT().
public class CountBigObjects implements Database.Batchable<sObject> { private Integer recordsCounted; private String key; public CountBigObjects(Integer recordsCountedParam, String keyParam) { recordsCounted = recordsCountedParam key = keyParam } public Iterable<SObject> start(Database.BatchableContext bc) { return [SELECT Custom_Field__c FROM Big_Object__b LIMIT 25000] } public void execute(Database.BatchableContext bc, List<Big_Object__b> bos){ // elaborare il batch di Big Objects e associarli agli account Map<Id, Big_Object__b> accountIdToBigObjectMap = new Map<Id, Big_Object__b>(); for (Big_Object__b bigObject : bos) { accountIdToBigObjectMap.put(bigObject.Account__c, bigObject); } Map<Id, Account> accountMap = new Map<Id, Account>( [SELECT Id, Name, ... FROM Account WHERE Id IN :accountIdToBigObjectMap.keySet()] ); for (Id accountId : accountMap.keySet()) { Big_Object__b bigObject = accountIdToBigObjectMap.get(accountId); Account account = accountMap.get(accountId); // eseguire qualsiasi azione che consenta di integrare il Big Object e l'account } } public void finish(Database.BatchableContext bc) { // Concatenare altre chiamate utilizzando la chiave principale del Big Object per ovviare al limite governor di 50 mila unità CountBigObjects nextBatch = new CountBigObjects(recordsCounted, key); Database.executeBatch(nextBatch); } }
In caso di ulteriori domande, aprire un caso con l'Assistenza tramite la Guida di Salesforce. Per informazioni sull'approccio di Salesforce al ritiro di prodotti e funzionalità, leggere Filosofia di ritiro delle funzionalità e dei prodotti.
000394892

We use three kinds of cookies on our websites: required, functional, and advertising. You can choose whether functional and advertising cookies apply. Click on the different cookie categories to find out more about each category and to change the default settings.
Privacy Statement
Required cookies are necessary for basic website functionality. Some examples include: session cookies needed to transmit the website, authentication cookies, and security cookies.
Functional cookies enhance functions, performance, and services on the website. Some examples include: cookies used to analyze site traffic, cookies used for market research, and cookies used to display advertising that is not directed to a particular individual.
Advertising cookies track activity across websites in order to understand a viewer’s interests, and direct them specific marketing. Some examples include: cookies used for remarketing, or interest-based advertising.