2012-05-02 32 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(Batch,[这是什么数字?]);'另外,你可以发布你的批处理调试日志摘要,它看起来像:'SOQL查询数量:0满分100 \ n查询行数量:50000个中的0个..等等。这些数据有助于确定如何加快速度。 –

+0

我不提供批量大小。我运行的第一个进程的范围只有300个记录。因此,使用300个列表项目的集合来过滤查询的其他对象,例如账户和联系人。这些被查询的其他对象正在大大减缓这一过程。 –

+0

默认批量大小为200,即您在start()方法中查询到的所有内容都被分成200个列表,并且200个项目在任何时候都被传递给作用域。您无法一次处理主要查询中的所有内容,因此我怀疑您可能需要重新编制逻辑来解决此问题。 –

回答

0

无论如何要发布整个批次顶点类?或者帮助了解更多的数据? 从您的地图看来,您的所有帐户(理论上)都有独特的网站,并且您的所有联系人都有唯一的电子邮件地址? 我假设你手工制作这些地图?这是你循环的帐户,并做一个 map.put(account.website,帐户)?

您是否有任何系统调试语句来确认您的地图尺寸? 如果在调用accounts.get()时没有帐户或没有联系,会发生什么情况?

而业务逻辑 - 是更多循环?

而且您使用批处理变量以静态方式 - 即你可以有一个计数器来计算的处理的记录总数。如果是这样,你的变量是一个列表?当然这可能是危险的。

你的范围对象又是什么对象?这并不重要,但我想你会希望将范围作为帐户本身或联系人本身。

我会尝试加入system.debug语句批处理,以验证它的运行,并看到了无限循环可能发生。