In einigen Salesforce Instanzen kommt es regelmäßig vor, dass gigantische Datenmengen durchsucht werden müssen. Meistens übernehmen Trigger diese Arbeit, und in den meisten Fällen brechen sie die Arbeit mit der folgenden Fehlermeldung ab:
Die Ursache liegt in der Limitierung vom Heap Speicher, der bei über 100.000 zu durchsuchenden Datensätzen überläuft.
Um dieses Problem zu lösen, muss der WHERE-Block mindestens ein indiziertes Feld enthalten,
z.B. customIndexedField__c = 'abc'
Zusätzlich soll auf die Abfrage von NULL Werten verzichtet werden,
z.B customIndexedField__c != null
Auszug aus der Salesforce Hilfe:
The following fields are indexed by default: primary keys (Id, Name and Owner fields), foreign keys (lookup or master-detail relationship fields), audit dates (such as LastModifiedDate), and custom fields marked as External ID or Unique. Nulls in the criteria prevented the use of indexes, and some of the criteria was redundant and extended execution time. Design the data model so that it does not rely on nulls as valid field values.
Es gibt allerdings ein Problem in Kombination mit Managed Packages
****************************************************************
Nach der Installation eines managed Packages muss der Index manuell gesetzt werden! Dazu muss ein neues Ticket bei Salesforce aufgemacht werden, dass der Index defekt ist.
Sieht so aus, als ob der Index nach der Installation eines managed Packages nicht aufgebaut wird. Salesforce hat bereits bestätigt, dass es ein Bug ist.
****************************************************************
In dem angehängten Video sieht man einen Trigger, der ein Lookup Feld aus einem managed Package beim Speichern eines Datensatzes abfragt. In diesem Fall kommt es zu der oben genannten Fehlermeldung.
verursacht den Fehler:
set<Id> setIdProjects = new set<Id>();
Projekt Ids werden im Set setIdProjects festgehalten
Lösung:
Wird statt Lookup-Feld aus dem Package ein neues Lookup- oder Textfeld mit External ID genommen, funktioniert der Trigger.
* Das Textfeld ist als "External ID" markiert.
set<String> setIdProjects = new set<String>();
Projekt Ids werden im Set setIdProjects als Strings festgehalten
ACHTUNG: setIdProjects darf keine NULL Werte enthalten!
System.QueryException: Non-selective query against large object type (more than 100000 rows)
Die Ursache liegt in der Limitierung vom Heap Speicher, der bei über 100.000 zu durchsuchenden Datensätzen überläuft.
Um dieses Problem zu lösen, muss der WHERE-Block mindestens ein indiziertes Feld enthalten,
z.B. customIndexedField__c = 'abc'
Zusätzlich soll auf die Abfrage von NULL Werten verzichtet werden,
z.B customIndexedField__c != null
Auszug aus der Salesforce Hilfe:
The following fields are indexed by default: primary keys (Id, Name and Owner fields), foreign keys (lookup or master-detail relationship fields), audit dates (such as LastModifiedDate), and custom fields marked as External ID or Unique. Nulls in the criteria prevented the use of indexes, and some of the criteria was redundant and extended execution time. Design the data model so that it does not rely on nulls as valid field values.
Es gibt allerdings ein Problem in Kombination mit Managed Packages
****************************************************************
Nach der Installation eines managed Packages muss der Index manuell gesetzt werden! Dazu muss ein neues Ticket bei Salesforce aufgemacht werden, dass der Index defekt ist.
Sieht so aus, als ob der Index nach der Installation eines managed Packages nicht aufgebaut wird. Salesforce hat bereits bestätigt, dass es ein Bug ist.
****************************************************************
In dem angehängten Video sieht man einen Trigger, der ein Lookup Feld aus einem managed Package beim Speichern eines Datensatzes abfragt. In diesem Fall kommt es zu der oben genannten Fehlermeldung.
verursacht den Fehler:
set<Id> setIdProjects = new set<Id>();
Projekt Ids werden im Set setIdProjects festgehalten
List<Time__c> times = [SELECT Id
FROM Time__c
WHERE prefix_Project__c=:setIdProjects];
FROM Time__c
WHERE prefix_Project__c=:setIdProjects];
Wird statt Lookup-Feld aus dem Package ein neues Lookup- oder Textfeld mit External ID genommen, funktioniert der Trigger.
* Das Textfeld ist als "External ID" markiert.
set<String> setIdProjects = new set<String>();
Projekt Ids werden im Set setIdProjects als Strings festgehalten
List<Time__c> times = [SELECT Id
FROM Time__c
WHERE Project_TXT__c=:setIdProjects];
FROM Time__c
WHERE Project_TXT__c=:setIdProjects];
ACHTUNG: setIdProjects darf keine NULL Werte enthalten!
Kommentare
Kommentar veröffentlichen