Я получаю ошибку

System.LimitException: превышен предел времени ЦП Apex

Он отлично работает в песочнице, когда я развертываю его в рабочей среде, он выдает ошибку, как указано выше.

Как в производстве я получил

set<String> unqName = new Set<String>();
List<Account> actLst = new List<Account>();
Map<String,List<Account>> act = new Map<String,List<Account>>(); // add list item to map

for(Account a:[SELECT Id,Name,duplicate__c FROM Account where Id In (Select Account_Name__c FROM Opportunity__c)])
{
    unqName.add(a.Name);
}

for(Account a:[SELECT Id,Name,duplicate__c FROM Account where Id In (Select AccountId FROM Contact)])
{
    unqName.add(a.Name);
}

List<AggregateResult> acc=[SELECT Name accname,  Prospect_Code__c  , COUNT(Id) ids FROM Account where Id Not
                           In (Select Account_Name__c FROM Opportunity__c) And Id Not In (Select AccountId FROM Contact)                           
                           GROUP BY Name, Prospect_Code__c  HAVING count(Id)>1];

List<Account> accList = [SELECT Id,Name,duplicate__c FROM Account where Id Not
                           In (Select AccountId from Contact) And Id Not In (Select Account_Name__c FROM Opportunity__c)];

for(Account acc : accList)
{
    if(!act.containsKey(acc.Name))
        {
            act.put(acc.Name,new List<Account>{acc});
        }
    else 
        {
            act.get(acc.Name).add(acc);
           // System.debug(act.get(acc.Name));
        }

}

System.debug('Name' + unqName);

for(String tmp : act.keySet()){
    for(String s:unqName){
        if(s!=tmp){
            for(Account a:act.get(tmp)){
                if(act.get(tmp).indexOf(a) != 0)     //error comes over here
                {
                    a.duplicate__c = True;
                    actLst.add(a);
                }
            }
        }
        else{
            for(Account a:act.get(s)){         
                    a.duplicate__c = True;
                    actLst.add(a);
            }
        }
    }
}

System.debug(' actLst size '+ actLst.size());

        if(!actLst.isEmpty()){
            update accList;
            System.debug('accList size ' + actLst.size());
            System.debug('accList ' + actLst);
        }
-1
Palash 3 Июл 2019 в 08:13

1 ответ

Я думаю, что у вас есть большие наборы данных в prod, которые выявляют некоторые проблемы. В вашем случае, я думаю, вы запрашиваете все учетные записи, а также в 3 случаях запрашиваете все свои контакты и opps. Кроме того, у вас есть 3 вложенных куба for loops., которые требуют времени.

Сказав это, похоже, что цель вашего кода — проверить, какие учетные записи являются дубликатами. Duplicate Rule делают именно это без использования кода. https://help.salesforce.com/articleView?id=duplicate_rules_map_of_reference.htm&type= 5

4
PartOfTheOhana 3 Июл 2019 в 09:06