2012-05-02 1 views
0

У меня есть класс пакетной вершины, где я создаю коллекции веб-сайтов и электронных писем, поэтому я могу использовать эти коллекции для фильтрации других других запросов, которые будут сделаны в коллекциях. Со всеми наборами наборов я хочу выполнить конечный цикл области для выполнения бизнес-процессов.Salesforce Batch Apex Class - запрос на большие наборы данных

Mockup:

for(Object o : scope) 
{ 
listEmails.add(o.Email); 
listWebsites.add(o.Websites); 
} 

Map<String, Account> accounts = Gather all accounts where website not in :listWebsties; //Website is key 
List<String, Contact> contacts = Gather all contacts where email not in :listEmails; //Email is key 

for(Object o : scope) 
{ 
    Account = accounts.get(o.website); 
    Contact = contacts.get(o.Email); 

    Perform business logic here 
} 

Проблема заключается в том, когда я запустить эту партию он остается обработку в течение нескольких часов. При работе с довольно небольшой базой данных это прекрасно работает. Но, работая в более крупной среде, возможно, это не лучшее решение.

Может ли кто-нибудь помочь мне ускорить пакетный процесс с более эффективным подходом?

+0

Когда вы запускаете партию, какой размер партии вы поставляете? 'Id BatchId = Database.executeBatch (Batch, [What is this number?]);' Также вы можете опубликовать сводку журнала отладки для вашей партии, это выглядит так: 'Количество запросов SOQL: 0 из 100 \ n Количество строк запроса: 0 из 50000 и т. Д. Эти данные помогут определить, как вы можете ускорить его. –

+0

Я не поставляю размер партии. Объем первого процесса, который я выполнял, составлял всего 300 записей. Таким образом, коллекция из 300 элементов списка используется для фильтрации других запрошенных объектов, т.е. учетных записей и контактов. Это те другие объекты, которые запрашиваются, что значительно замедляет процесс. –

+0

Размер партии по умолчанию - 200, т. Е. Все, что вы запрашиваете в методе start(), разбивается на списки из 200, а 200 единиц передаются в область видимости в любой момент времени. Вы не можете обрабатывать все в основном запросе за один раз, поэтому я подозреваю, что вам может понадобиться переработать свою логику, чтобы учесть это. –

ответ

0

Есть ли все-таки, чтобы опубликовать весь класс класса ассемблера? Или помочь понять данные больше? На вашей карте похоже, что все ваши учетные записи (в теории) имеют уникальные веб-сайты, и у всех ваших контактов есть уникальные электронные письма? Я предполагаю, что вы строите эти карты вручную? То есть вы перебираете учетные записи и делаете map.put (account.website, account)?

У вас есть какие-либо системные отладочные заявления для подтверждения размеров вашей карты? Что произойдет, если нет учетной записи или нет контакта при вызове accounts.get()?

И бизнес-логика - это больше циклов?

И вы используете периодические переменные статическим образом - то есть вы можете иметь счетчик для подсчета общего количества обработанных записей. Если да, то есть ли ваша переменная список? это может быть опасно, конечно.

Также какой объект является объектом области видимости? Не то чтобы это важно, но я бы подумал, что вы хотите, чтобы ваша область была самими Счетами или самими Контактами.

Я бы попытался добавить инструкции system.debug в вашу партию, чтобы проверить ее работу и посмотреть, где может произойти бесконечный цикл.

Смежные вопросы