关于so​​ql查询的调控器限制的澄清

时间:2012-05-31 14:15:34

标签: salesforce apex-code soql

设定:

假设我有五个我创建的联系人sObject和顶点。当您一次插入一个联系人时,您通过触发器和它使用的东西进行x soql查询。

问题:

  1. 因此,如果您在代码中一次插入一个联系人,则会获得5x soql查询(对吗?)。

  2. 现在假设您将这5个人放入一个数组并使用一个插入插入数组。有多少个soql查询?

  3. 关于2,如果它是5倍,我们为什么要打扰?那么我们可以将DML的数量减少4?

  4. 谢谢,

    半新人

2 个答案:

答案 0 :(得分:6)

给定的代码块和由于它而执行的所有同步顶点代码在单个执行上下文中进行评估,这意味着它具有一组调控器限制。在您给出的示例中,假设您的Contact触发器生成3个SOQL查询和一个DML语句。如果您单独插入每个联系人,那么您将为每个触发器使用5个DML语句(每个联系人插入一个)+ 1个DML语句,每个触发器使用3 * 5个SOQL语句,从而导致总共15个SOQL语句和10个DML代码的陈述。但是,如果您将它们作为列表插入,那么所有五个记录将作为列表发送到您的触发器(1个DML语句),然后执行其3个SOQL查询和1个DML语句一次,总共3个SOQL查询和2 DML声明。

这里的关键是设计触发器(以及大多数其他代码),以便查询和语句的数量不依赖于您正在处理的记录数。 Salesforce在此提供了简要指南:http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_bulk_idioms.htm

答案 1 :(得分:1)

如果您要一次插入一个“联系人”,那么是的,您很可能最终得到的SOQL查询数量是其五倍。但不建议以这种方式插入这些内容。当你提到你想要通过一次insert电话插入一组记录时,你就走在了正确的轨道上。

如果您的触发器写得正确,无论是插入单个记录还是20条记录,都应该使用相同数量的SOQL查询。如果查询的数量随着你插入的记录数量的增加而增加,那么触发器很可能在某种循环中有一个查询...这是一个很好的方法,可以先行进入调控器限制。在开发触发器时请记住Apex Code Best Practices(请参阅代码示例的链接):

  • 尽可能将SOQL查询保留在循环之外
  • 确保从触发器调用的辅助方法能够有效地对集合进行操作
  • 大量使用Apex集合,以更有效地使用您无法避免的查询