Loading

Effizienter Codieren zum Vermeiden von Apex-CPU-Zeitüberschreitungsfehlern

Veröffentlichungsdatum: Aug 19, 2020
Beschreibung
Salesforce verfügt über eine Zeitüberschreitungsobergrenze für Transaktionen, die auf der CPU-Auslastung basiert. Wenn die Transaktionen zu viel CPU-Zeit in Anspruch nehmen, werden sie als langfristige Transaktionen heruntergefahren.
Lösung

Es werden nur Ereignisse gezählt, bei denen die CPU des Anwendungsservers genutzt wird. Es gibt einige Ereignisse, die die Anwendungsserver-CPU beanspruchen, jedoch nicht gezählt werden. Dies sind in der Regel Ereignisse, die Sie als Programmierer nicht steuern können. Beispielsweise zählt die in der Datenbank zum Abrufen der Datensätze aufgewendete Zeit nicht. Ebenso wenig zählt die für die Rückgabe eines Callouts aufgewendete Wartezeit. Sie haben keine Kontrolle darüber, wann Ihr Code kompiliert werden muss. Daher wird diese Zeit nicht gezählt.
 

Fast alle anderen Aktionen auf dem Anwendungsserver, einschließlich deklarativer Aktionen, werden jedoch mitgezählt. Wenn die DML in Ihrem Code eine Validierungsregel mit einer Formel ermittelt, wird die zum Auswerten der Formel aufgewendete Zeit gezählt. Die CPU-Zeit wird für alle Ausführungen auf den Salesforce-Anwendungsservern berechnet, die in einer Apex-Transaktion ablaufen – für den ausgeführten Apex-Code und alle Prozesse, die von diesem Code aufgerufen werden, wie Paketcode und Workflows. Die CPU-Zeit wird für jede Transaktion gesondert betrachtet und von anderen Transaktionen isoliert. Vorgänge, die keine CPU-Zeit des Anwendungsservers beanspruchen, werden nicht auf die CPU-Zeit angerechnet.
 

Gezählt werden

  • Der gesamte Apex-Code
  • In Apex zur Verfügung gestellte Bibliotheksfunktionen
  • Workflow-Ausführung

Nicht gezählt werden

Bewährte Vorgehensweisen zum Vermeiden von CPU-Zeitüberschreitungen

Unter Apex Code Best Practices (Bewährte Vorgehensweisen für Apex-Code) wird beschrieben, wie sich CPU-Zeitüberschreitungen vermeiden lassen. Im Folgenden werden einige der Vorschläge näher behandelt. 

Verwenden einer zuordnungsbasierten Abfrage

List<Account> lstacc=[Select Id from Account limit 10000]; Set<Id> setIds=new Set<Id>(); for(Account a:lstacc){ //More CPU time for sure due to looping setIds.add(a.id); } //Using Map query saves CPU time //Fetching all account in map Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]); //Creating list of accounts List<account> accList = aMap.values() ; //Creating set of ids Set<id> accIds = aMap.keySet() ;

Erkunden Sie, ob Ihr Unternehmen Ihnen das asynchrone Ausführen des Vorgangs ermöglicht

In manchen Fällen wird der Geschäftsprozess nicht in Echtzeit ausgeführt.Wenn die Möglichkeit besteht, dass der Code in @future ausgeführt wird, wird der Kontext unterbrochen. Zudem beträgt die Obergrenze der CPU-Zeitüberschreitung für den asynchronen Prozess 60 Sekunden (das Sechsfache des synchronen Prozesses). Das sollten Sie beachten, wenn die Gefahr besteht, dass Sie die Obergrenze überschreiten.

Aggregieren der SOQL-Nutzung

Da die Datenbankzeit nicht auf die CPU-Zeit angerechnet wird, empfiehlt es sich, die Nutzung der aggregierten SOQL für Ihren geschäftlichen Anwendungsfall zu erkunden.

Angenommen, Sie möchten den Feldwert einiger Datensätze aufrechnen. Wenn Sie eine normale for-Schleife verwenden, wird offensichtlich mehr CPU-Zeit in Anspruch genommen. Sie sollten stattdessen versuchen, Ihre Berechnung mithilfe von SUM,AVG-Aggregatfunktionen auf der Datenbankebene an sich zu berechnen. Dadurch reduzieren Sie die CPU-Zeit und verschieben den Prozess auf die Datenbankebene. Erkunden Sie Optionen zur Gruppierung oder erstellen Sie einen Filter auf Datenbankebene. Verschieben Sie Ihre Berechnungen auf Datenbankebene, um die Möglichkeit zu verringern, dass CPU-Zeitüberschreitungsprobleme auftreten.

Verwenden Sie nur die erforderlichen Daten zum Ausführen einer Schleife

Es ist wichtig, die Daten zu filtern, um nur die erforderlichen Daten zu verwenden, wenn Sie eine for-Schleife für eine Liste von Datensätzen ausführen. Eine zu starke Schleifenverwendung erhöht die CPU-Zeit. Gleiches galt, als noch keine Obergrenze für die Anzahl der Skriptanweisungen bestand.

Hinweis: Derzeit besteht ein bekanntes Problem mit DML-Einfügeoperationen, die die Apex-CPU beanspruchen, wenn sie für eine große Anzahl von Datensätzen mit zu vielen Spalten ausgeführt werden. 

Nummer des Knowledge-Artikels

000387833

 
Laden
Salesforce Help | Article