Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Abfragen großer Objekte

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
  • Verwenden von Standard-SOQL zum Abfragen großer Objekte
  • Verwenden von Async SOQL zum Abfragen großer Objekte
  • Nennen der Vor- und Nachteile der Verwendung von Async SOQL gegenüber Standard-SOQL

SOQL und Async SOQL im Vergleich

Große Objekte können mit SOQL oder Async SOQL abgefragt werden. Async SOQL nutzt eine Teilmenge der SOQL-Befehle. Außerdem wurde es von Grund auf so konzipiert, dass es die riesigen Datenmengen handhaben kann, die in einem großen Objekt gespeichert werden können. Da Async SOQL Abfragen asynchron ausgeführt werden, müssen Sie sich keine Gedanken darüber machen, ob die Ausführung von Abfragen wegen Timeout scheitert. Async SOQL-Abfragen werden im Hintergrund verarbeitet und können für Salesforce-Entitätsdaten, Standardobjekte, benutzerdefinierte Objekte und große Objekte ausgeführt werden. Async SOQL wird über die Chatter-REST-API implementiert.

Generell sollten Sie Async SOQL dem standardmäßigen SOQL vorziehen, wenn Sie mit großen Datenmengen zu tun haben. Wenn Sie nur ein kleines Datenset aus einem großen Objekt benötigen oder die Ergebnisse sofort brauchen, verwenden Sie Standard-SOQL. Async SOQL funktioniert auch mit Standard- und nicht-großen benutzerdefinierten Objekten, die Unterstützung für solche Objekte ist jedoch noch in der Pilotphase.

Nicht vergessen: Benutzerdefinierte große Objekte sind in jeder Lizenz enthalten, doch Async SOQL ist nur in Lizenzen für zusätzliche Kapazität für große Objekte enthalten.

Verwenden Sie Standard-SOQL in folgenden Fällen:
  • Sie möchten die Ergebnisse in der Benutzeroberfläche anzeigen, ohne dass der Benutzer darauf warten muss.
  • Sie möchten Ergebnisse sofort zurückgeben, damit sie innerhalb eines Blocks mit Apex-Code bearbeitet werden können.
  • Sie wissen, dass Ihre Abfrage eine kleine Datenmenge zurückgeben wird.
Verwenden Sie Async SOQL in folgenden Fällen:
  • Sie führen die Abfrage für Millionen von Datensätzen aus.
  • Sie möchten sicherstellen, dass Ihre Abfrage ausgeführt wird.
  • Sie müssen keine aggregierten Abfragen durchführen oder außerhalb des Index filtern.

Anwendungsfall von Async SOQL

Kurz gesagt, können Sie mit Async SOQL die Millionen von Datensätzen in einem großen Objekt verarbeiten und in ein überschaubares, funktionierendes Datenset extrahieren.

Verwendung von SOQL zum Abfragen großer Objekte

Wenn Sie bereits mit der Verwendung von SOQL vertraut sind, werden Sie sich hier gleich zuhause fühlen. Bei der Verwendung von Standard-SOQL für große Objekte sollten Sie ein paar Dinge im Hinterkopf behalten, die sich von der Verwendung von SOQL für nicht-große Objekte unterscheiden. Bei SOQL-Abfragen mit großen Objekten müssen Sie Ihre Abfrage ausgehend von dem ersten Feld, das im Index definiert wurde, erstellen, ohne dass Felder zwischen dem ersten und dem letzten Feld der Abfrage übersprungen werden. Wenn Ihr Index also beispielsweise drei Felder definiert, können Sie keine Abfrage mit nur dem ersten und dritten Feld erstellen.

Sie können diese Vergleichsoperatoren =, <, >, <=, >= oder IN für das letzte Feld in der Abfrage verwenden. Für alle vorherigen Felder in Ihrer Abfrage können Sie nur den Operator = verwenden. Die Operatoren !=, LIKE, NOT IN, EXCLUDES und INCLUDES sind in Abfragen mit großen Objekten nicht gültig.

Bei den folgenden Abfragen wird angenommen, dass Sie über ein großes Objekt verfügen, in dem der Index von Account__c, Game_Platform__c und Play_Date__c definiert ist.

Diese Abfrage gibt alle drei Felder im Index an. In diesem Fall kann der Filter für Play_Date__c ein Zeitraum sein.
SELECT Account__c, Game_Platform__c, Play_Date__c
FROM Customer_Interaction__b
WHERE Account__c='001R000000302D3' AND Game_Platform__c='PC' AND Play_Date__c=2017-09-06T00:00:00Z
Diese Abfrage kann nicht ausgeführt werde, da sie eine Lücke an der Stelle enthält, an der Game_Platform__c stehen sollte.
SELECT Account__c, Game_Platform__c, Play_Date__c
FROM Customer_Interaction__b
WHERE Account__c='001R000000302D3' AND Play_Date__c=2017-09-06T00:00:00Z

Verwendung von Async SOQL zum Abfragen großer Objekte

Es gibt zwei Möglichkeiten, Async SOQL zu verwenden, um ein überschaubares Datenset aus einem großen Objekt zu extrahieren. Die erste Möglichkeit sind Filter. Mit Hilfe von Filtern können Sie eine kleine Teilmenge der Daten Ihres großen Objekts in ein benutzerdefiniertes Objekt extrahieren. Dieses können Sie dann in Ihren Berichten, Dashboards oder anderen cleveren Analysetools verwenden.

Die zwei Methode, ein überschaubares Datenset zu erzeugen, ist die Verwendung grober Aggregationen. Async SOQL unterstützt folgende aggregierten Funktionen: AVG(field), COUNT(field), COUNT_DISTINCT(field), SUM(field), MIN(field), MAX(field). Mit diesen Aggregatfunktionen können Sie viel feiner steuern, welche Daten aus dem großen Objekt extrahiert werden.

Bilden der Abfrage

Mithilfe von Async SOQL fragen wir unser benutzerdefiniertes Objekt Customer_Interaction__b ab und lenken die Ergebnisse in unser Zielobjekt Customer_Interaction_Analysis__c. Wir extrahieren die Account- und In-Game-Kaufinformationen für ein bestimmtes Datum aus unserem benutzerdefinierten großen Objekt in unser Zielobjekt, das wir dann für Berichte und Analysen verwenden können.

Pflichtfelder
Name Typ Beschreibung
query Zeichenfolge Gibt die Parameter für die SOQL-Abfrage an, die Sie ausführen möchten
targetObject Zeichenfolge Ein Standard-Objekt, benutzerdefiniertes Objekt, externes Objekt oder großes Objekt, in das die Ergebnisse der Abfrage eingefügt werden sollen
targetFieldMap Map<String, String>

Definiert, wie die Felder in der Abfrageergebnissen den Feldern im Zielobjekt zugeordnet werden sollen

Achten Sie beim Definieren des Parameters targetFieldMap darauf, dass die Feldtypzuordnungen übereinstimmen. Stimmen Quell- und Zielfeld nicht überein, gilt Folgendes:
  • Jedes Quellfeld kann einem Zieltextfeld zuordnet werden.
  • Wenn das Quell- und das Zielfeld beide numerisch sind, muss das Zielfeld mindestens die gleiche Anzahl von Nachkommastellen wie das Quellfeld haben. Ist dies nicht der Fall, schlägt die Anforderung fehl. Dieses Verhalten soll sicherstellen, dass bei der Konvertierung keine Daten verloren gehen.
  • Wenn ein Feld im Abfrageergebnis mehrfach zugeordnet wird, selbst wenn unterschiedliche Zielobjektfelder zugeordnet werden, wird nur die letzte Zuordnung verwendet.
Beispiel-URI
https://yourInstance.salesforce.com/services/data/v41.0/async-queries/

POST-Anforderungstext

{ 
   "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",
   
   "operation": "insert",
   
   "targetObject": "Customer_Interaction_Analysis__c", 
        
   "targetFieldMap": {"Account__c":"Account__c",
                      "In_Game_Purchase__c":"Purchase__c"
                      },
   "targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
                      "Copy fields from source to target":"BackgroundOperationDescription__c"
                     }
}
Bei dieser Abfrage extrahieren wir die Account- und In-Game-Kaufinformationen für ein bestimmtes Datum (den 06.09.2017) aus unserem großen Objekt für Kundeninteraktionen und senden diese Daten an das von erstellte benutzerdefinierte Objekt Customer_Interaction_Analysis__c. Da wir asynchrone SOQL und nicht die standardmäßige SOQL verwenden, können wir filtern, ohne uns Gedanken über die Einbeziehung der anderen indizierten Felder machen zu müssen. Dieses neue benutzerdefinierte Objekt enthält alle Account- und In-Game-Kaufinformationen für dieses Datum. An diesem Punkt können wir dann mit Analysen beginnen und versuchen herauszufinden, warum unser Spiel so erstaunlich erfolgreich ist

POST-Antworttext

Der Antworttext enthält die jobId der Abfrage, ihren Status und sonstige relevante Meldungen.
{ 
   "jobId": "08PD000000003kiT", 
   
   "message": "",
    
   "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",  
    
   "status": "New",
     
   "targetObject": "Customer_Interaction_Analysis__c", 
     
   "targetFieldMap": {"Account__c":"Account__c", 
                      "In_Game_Purchase__c":"Purchase__c"
                     },
   "targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
                      "Copy fields from source to target":"BackgroundOperationDescription__c"
                     } 
}

Verfolgen des Status Ihrer Abfrage

Um den Status einer Abfrage zu verfolgen, geben Sie ihre jobID in einer HTTP GET-Anforderung an. Der Status der Abfrage wird im Feld status zurückgegeben. Wenn Sie keine jobID angeben, wird der Status all Ihrer Abfragen zurückgegeben. Der status kann wie folgt lauten:
  • Canceled: Der Auftrag wurde abgebrochen, bevor er ausgeführt werden konnte.
  • Success: Der Auftrag wurde erfolgreich abgeschlossen.
  • Failed: Der Auftrag ist fehlgeschlagen, nachdem das System ihn abgeschickt hat oder, weil die Anforderung die Async-SOQL-Grenzwerte überschritten hat. Das Meldungsfeld enthält Einzelheiten über die Fehlerursache.
  • Running: Der Auftrag wird erfolgreich ausgeführt, und die Organisation hat keine Grenzwerte überschritten.
  • Scheduled: Der neue Auftrag wurde erstellt und geplant, wird aber noch nicht ausgeführt.

Sie können eine Abfrage auch mit einer HTTP DELETE-Anforderung abbrechen, indem Sie ihre jobId angeben. Das Abbrechen einer abgeschlossenen Abfrage hat keine Auswirkung.

Denken Sie daran, Async SOQL wird asynchron ausgeführt. Das bedeutet, dass es eine Weile dauern kann, bis Ihre Abfrage abgeschlossen wird. Wie wir gesagt, wenn es schnell gehen soll und Ihr Datenset klein genug ist, verwenden Sie Standard-SOQL. Alternativ können wir uns auch ein weniger beliebtes fiktives Spiel für diese Beispiele ausdenken, aber das macht doch keinen Spaß, oder?

Beispiel-URI
https://yourInstance.salesforce.com/services/data/v41.0/async-queries/08PD000000003kiT
GET-Beispielantwort
{
"jobId": "08PD000000003kiT",
"message": "",
"query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",  
"status": "Success",
"targetObject": "Customer_Interaction_Analysis__c",
"targetFieldMap": {"Account__c":"Account__c",
"In_Game_Purchase__c":"Purchase__c" } 
}
Diese Antwort zeigt, dass unsere Abfrage erfolgreich abgeschlossen wurde. Sehr schön! Höchste Zeit, die Berichte und Dashboards vorzubereiten!

Behandeln von Fehlern

Bei der Ausführung einer Async SOQL-Abfrage können zwei verschiedene Arten von Fehlern auftreten.
  • Ein Fehler bei der Abfrageausführung
  • Ein oder mehrere Fehler beim Schreiben der Ergebnisse in das große Zielobjekt

Das Senden einer ungültigen Abfrage und das Überschreiten eines der Async SOQL-Grenzwerte sind Beispiele für Ausführungsprobleme. Ein weiteres Beispiel für einen Ausführungsfehler ist, wenn eine Abfrage ein Problem mit der zugrunde liegenden Infrastruktur verursacht. Bei diesen Fehlern enthält der Antworttext die Statusangabe Failed. Der Parameter "message" liefert weitere Informationen über die Fehlerursache.

In anderen Fällen wird die Abfrage erfolgreich ausgeführt, doch beim Versuch, die Ergebnisse in das Zielobjekt zu schreiben, tritt ein Fehler auf. Aufgrund des Datenvolumens wäre die Erfassung jedes einzelnen Fehlers ineffizient. Aus diesem Grund werden Teilmengen der erzeugten Fehler im Objekt BackgroundOperationResult erfasst und sieben Tage gespeichert. Sie können dieses Objekt unter Angabe der jobId der Async SOQL-Abfrage abfragen, um die Fehler für die spezielle Async SOQL-Abfrage herauszufiltern. Informationen über Async SOQL-Aufträge werden ein Jahr lang gespeichert.

Zusammenfassung

Jetzt wissen Sie alles, was nötig ist, um benutzerdefinierte große Objekte in Ihrer Organisation zu verwenden. Es Ihnen jetzt Milliarden von Datensätzen zu Diensten.

Wir haben hier jetzt nur an der Oberfläche von Async SOQL gerührt. Sehen Sie sich unbedingt die Links im Abschnitt "Ressourcen" an, um alles über die von Async SOQL unterstützten Standard-SOQL-Befehle zu erfahren und weitere Anwendungsbeispiele kennen zu lernen. Zudem finden Sie dort Informationen über die optionalen Felder, die Sie in Ihren POST-Anforderungen verwenden können. Außerdem empfehlen wir Ihnen unser Modul Analytics Data Integration Basics mit Anregungen dazu, wie Sie Analysen für die aus großen Objekten extrahierten Daten einrichten. Denken Sie nur an all die cleveren Grafiken und Dashboards, die Sie mit diesen Daten erstellen können!