2012-05-02 4 views
0

웹 사이트 및 전자 메일 모음을 구축하는 배치 정점 클래스가 있으므로 이러한 컬렉션을 사용하여 컬렉션으로 작성되는 다른 다른 쿼리를 필터링 할 수 있습니다. 모든 콜렉션이 설정되면 비즈니스 프로세스를 수행하는 범위의 최종 루프를 실행하려고합니다.대용량 데이터 세트에 대한 쿼리 Salesforce 배치 Apex 클래스

목업 :

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 (일괄 처리, [이 번호는 무엇입니까?])'또한 일괄 처리에 대한 디버그 로그 요약을 게시 할 수 있습니까? 'SOQL 쿼리 수 : 0 개 중 0 개 \ n 쿼리 행 수 : 50000 개 중 0 개 .. '이러한 데이터는 속도 향상 방법을 결정하는 데 도움이됩니다. –

+0

배치 크기를 제공하지 않습니다. 첫 번째 프로세스 실행 범위는 단지 300 레코드였습니다. 따라서 300 개의 목록 항목 모음이 쿼리 된 다른 개체 즉, 계정 및 연락처를 필터링하는 데 사용됩니다. 프로세스를 크게 늦추고있는 쿼리 된 다른 개체입니다. –

+0

기본 일괄 처리 크기는 200입니다. 즉, start() 메소드에서 쿼리를 얻는 모든 항목이 200 개의 목록으로 분리되고, 한 번에 200 개의 항목이 범위로 전달됩니다. 한 번에 메인 쿼리의 모든 것을 처리 할 수는 없으므로이를 고려하여 로직을 다시 작성해야 할 수도 있습니다. –

답변

0

어쨌든 전체 배치 정점 클래스를 게시 하시겠습니까? 또는 데이터를 더 잘 이해하는 데 도움이됩니까? 지도에서 모든 계정 (이론적으로)은 고유 한 웹 사이트를 가지고 있으며 모든 연락처에 고유 한 이메일이있는 것 같습니다. 나는이지도를 직접 작성한다고 가정합니까? 즉, 계정을 반복하고 map.put (account.website, account)을 수행 하시겠습니까?

지도 크기를 확인하는 시스템 디버그 문이 있습니까? accounts.get()을 호출 할 때 계정이 없거나 연락이 없으면 어떻게됩니까?

비즈니스 논리 - 더 반복적입니까?

정적 변수에서 일괄 처리 변수를 사용하고 있습니까? 즉, 처리 된 총 레코드 수를 계산할 수있는 카운터를 가질 수 있습니다. 그렇다면 변수가 목록입니까? 물론 위험 할 수 있습니다.

범위 개체는 어떤 개체입니까? 중요한 것은 아니지만 범위를 계정 자체 또는 대화 상대 자신으로 바꾸고 싶다고 생각합니다.

배치에 system.debug 문을 추가하여 실행 중인지 확인하고 무한 루프가 발생할 수있는 위치를 확인하십시오.