Salesforce wird die Async SOQL-Funktion für große Objekte ab der Version Summer '23 einstellen und nicht mehr unterstützen.
Async SOQL wird im Rahmen der laufenden Verbesserung der Salesforce Platform eingestellt, da wir uns von Technologien mit Unterstützung für Async SOQL wegentwickeln. Diese Methode wird künftig durch APIs ersetzt, mit denen unsere Kunden besser vertraut sind.
Was bedeutet diese Änderung für mich?
Nach dem Upgrade Ihrer Organisation auf die Version Summer '23 müssen Sie die Bulk-API oder Batch-Apex verwenden, wenn Sie benutzerdefinierte große Objekte abfragen oder Berichte dazu erstellen möchten. Nach Veröffentlichung der Version stehen Aufträge, die Async SOQL ausführen, nicht mehr zur Verfügung. Wir raten dazu, Ihren Ersatz für Async SOQL in Sandbox-Organisationen zu testen, bevor die Version Summer '23 erscheint. Konsultieren Sie die Salesforce Trust-Site, um die nötige Planung für das Upgrade in Ihrer Organisation vorzunehmen.
Kann CRM Analytics weiter Daten aus großen Objekten laden?
Ja, CRM Analytics nutzt Bulk-API-Abfragen, um die Daten zu laden.
Was sollte ich nutzen, wenn ich mehr als 50.000 Datensätze abfragen möchte?
Die Abfrage von mehr als 50.000 Ergebnissen ist sowohl mit Bulk-API als auch mit Batch-Apex möglich. Salesforce empfiehlt allerdings die Verwendung von Batch-Apex, indem zusätzliche Batch-Apex-Aufträge gestartet werden.
Wie muss ich vorgehen, wenn ich mehrere Millionen Datensätze habe und bei meinen Bulk- oder Apex-Abfragen eine Zeitüberschreitung auftritt?
Wenn Sie bei einer sehr großen Anzahl von Datensätzen effizientere Abfragen gewährleisten möchten, können Sie die gewünschten Abfragefelder in Ihren Index einschließen oder ändern, wie Ihre Daten in großen Objekten gespeichert werden. Wenn Sie die Daten in mehrere einzelne große Objekte aufteilen, können Sie mit Async SOQL Daten in diese neuen Objekte migrieren. Wenn Sie Daten über Async SOQL migrieren möchten, sollten Sie dies unbedingt tun, bevor Async SOQL ab der Version Summer '23 eingestellt wird.
Was wenn ich von großen Objekten weg migrieren möchte?
Wenn Sie zu einer anderen Lösung migrieren, können Sie mit Database.deleteImmediate Ihre Daten löschen. Salesforce wird Ihre Daten nicht löschen. Sie müssen Ihre Daten selbst löschen.
Welche Alternativen gibt es zu Async SOQL und wie werden sie verwendet?
Sie können große Objekte mit Bulk-API und Batch-Apex abfragen. Im Folgenden sehen Sie
Beispielalternativen für existierende Async SOQL-Abfragen.
Feld-Aktivierungsprotokoll
Dieses Beispiel zeigt, wie Sie "FieldHistoryArchive" abfragen und die Ergebnisse in einer CSV-Datei analysieren können.
Beispiel-URI
/services/data/vXX.X/jobs/query
Beispiel für eine POST-Abfrage
{ "operation": "query", "query": "SELECT ParentId, FieldHistoryType, Field, Id, NewValue, OldValueFROM FieldHistoryArchive WHERE FieldHistoryType = ‘Account’ AND CreatedDate > LAST_MONTH" }
Verwenden Sie die Ressource Get Results for a Query Job (Ergebnisse für Abfrageauftrag abrufen).
Beispiel für eine CURL-Anfrage
curl --include --request GET \ --header "Authorization: Bearer token" \ --header "Accept: text/csv" \ https://instance.salesforce.com/services/data/vXX.X/jobs/query/750R0000000zxr8IAA/results ?maxRecords=50000
Diese Anfrage resultiert in einer CSV-Datei, die zu Prüfzwecken kontrolliert werden kann.
Customer 360 View
Batch-Apex kann alternativ zu Async SOQL zur automatisierten Verarbeitung in einem großen Objekt, ApiEvent, ReportEvent oder ListViewEvent verwendet werden. Das folgende Beispiel zeigt, wie Sie eine Verarbeitung hinzufügen, die korrelierte Daten referenziert.
Führen Sie eine Batch-Apex-Abfrage zu einem großen Objekt aus und korrelieren Sie die Kontaktinformationen, die mit diesem großen Objekt verknüpft sind.
Hinweis: Große Objekte können in Apex nicht in unbegrenzter Anzahl abgefragt werden. Es gelten Heap-Limits von 6 MB für synchrones Apex und 12 MB für asynchrones Apex Wenn Sie zum Beispiel 6.000 Einträge mit je 1 KB haben, können Sie nur 6.000 Datensätze im Speicher ablegen.
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){ // process the batch of Big Objects and associate them to Accounts 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); // perform any actions that integrate the Big Object and Account } } public void finish(Database.BatchableContext bc){ // Daisy chain additional calls using the primary key of the Big Object to get around the 50k governor limit QueryBigObjectAndContact nextBatch = new QueryBigObjectAndContact(key); Database.executeBatch(nextBatch); } }
Echtzeit-Ereignisüberwachung
Dieses Beispiel zeigt, wie ein großes Ereignisobjekt anhand von Feldinhalten abgefragt und analysiert wird.
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){ // Process this list of entities if a certain attribute matches for (ApiEvent event: events) { String objectString = 'Patent__c'; String eventIdentifier = event.EventIdentifier; if (eventIdentifier.contains(objectString) { // Perform actions on the event that contains 'Patent__c' } lastEventDate = format(event.EventDate); } } public void finish(Database.BatchableContext bc){ // Daisy chain additional calls using EventDate or other filter fields to get around the 50k governor limit EventMatchesObject nextBatch = new EventMatchesObject(lastEventDate); Database.executeBatch(nextBatch); } }
Aggregatabfragen
Dieses Beispiel zeigt eine alternative Möglichkeit für Aggregatabfragen, die mit der Methode COUNT() vergleichbar ist.
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){ // process the batch of Big Objects and associate them to Accounts 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); // perform any actions that integrate the Big Object and Account } } public void finish(Database.BatchableContext bc) { // Daisy chain additional calls using the primary key of the Big Object to get around the 50k governor limit CountBigObjects nextBatch = new CountBigObjects(recordsCounted, key); Database.executeBatch(nextBatch); } }
Sollten Sie weitere Fragen haben, öffnen Sie über die Salesforce-Hilfe einen Kundenvorgang beim Support. Mehr über die Vorgehensweise von Salesforce bei der Einstellung von Produkten und Funktionen erfahren Sie in der Philosophie zur Einstellung von Produkten und Funktionen.
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.