Collections Salesforce批处理Apex类-针对大型数据集进行查询

Collections Salesforce批处理Apex类-针对大型数据集进行查询,collections,batch-file,salesforce,force.com,Collections,Batch File,Salesforce,Force.com,我有一个batch apex类,我正在构建网站和电子邮件的集合,这样我就可以使用这些集合来过滤其他查询,这些查询将被生成集合。设置了所有集合后,我希望通过作用域的最后一个循环来执行业务流程 模型: for(Object o : scope) { listEmails.add(o.Email); listWebsites.add(o.Websites); } Map<String, Account> accounts = Gather all accounts where websi

我有一个batch 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
}
for(对象o:范围)
{
listEmails.add(o.Email);
列表网站。添加(o.Websites);
}
Map accounts=收集网站不在的所有帐户:listWebsties//网站是关键
列出联系人=收集电子邮件不在的所有联系人:listEmails//电子邮件是关键
for(对象o:范围)
{
Account=accounts.get(o.website);
Contact=contacts.get(o.Email);
在这里执行业务逻辑
}
问题是,当我运行此批处理时,它会持续处理数小时。当使用一个相当小的数据库时,这很好。但在一个更大的环境中工作,这也许不是最好的解决方案


有谁能帮我用一种更有效的方法来加速批处理过程吗?

是否还有其他方法来发布整个批处理apex类?或者帮助更多地理解数据? 从你的地图上看,你的所有账户(理论上)都有独特的网站,你的所有联系人都有独特的电子邮件? 我想你是手工绘制这些地图的吧?也就是说,你在账户上循环,做一个 地图。放置(帐户。网站,帐户)

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

还有业务逻辑——是否更多的是循环

您是否以静态方式使用批处理变量?即,您可以使用计数器来计算处理的记录总数。如果是,您的变量是列表吗?这当然是危险的

您的范围对象是什么?这并不重要,但我认为您希望自己的范围是客户本身或联系人本身


我会尝试将system.debug语句添加到批处理中,以验证它是否正在运行,并查看无限循环可能发生的位置。

运行批处理时,您提供的批处理大小是多少<代码>Id BatchId=数据库.executeBatch(批处理,[这个数字是多少?])另外,您是否可以发布批处理的调试日志摘要,它看起来像:
SOQL查询数:100中的0\n查询行数:50000中的0。。等等。
这些数据将有助于确定如何加快速度。我不提供批量大小。我运行的第一个进程的范围只有300条记录。因此,300个列表项的集合用于过滤查询的其他对象,即帐户和联系人。正是那些被查询的其他对象大大减慢了处理速度。默认的批处理大小为200,即在start()方法中查询到的所有内容都被分解为200个列表,并且每次都有200个项目被传递到scope。您无法一次性处理主查询中的所有内容,因此我怀疑您可能需要修改您的逻辑来说明这一点。我刚刚注意到,在我未在中使用的psuedo代码中。这是我的错误,实际代码正在筛选列表集合中的帐户和联系人。这对我来说很奇怪,为什么批处理过程要花这么长时间才能运行,而我要做的就是建立电子邮件和网站的列表,然后用这些电子邮件和网站建立帐户和联系人的集合,这样我就可以在后一个范围循环中引用这些对象。我想参考与最终范围记录的网站或电子邮件相匹配的账户和联系记录。批处理时间太长。您是使用salesforce批处理(如Matthew和Lacey所述)还是将您的过程称为批处理?