2

设置:

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

问题:

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

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

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

谢谢,

半新人

4

2 回答 2

6

给定的代码块和所有由于它而执行的同步顶点代码在单个执行上下文中进行评估,这意味着它具有一组调控器限制。在您给出的示例中,假设您的 Contact 触发器进行 3 个 SOQL 查询和一个 DML 语句。如果您分别插入每个联系人,那么您将使用 5 个 DML 语句(每个联系人插入一个)+ 每个触发器 1 个 DML 语句,每个触发器使用 3 * 5 个 SOQL 语句,总共 15 个 SOQL 语句和 10 个 DML您的代码的语句。但是,如果您将它们作为列表插入,那么所有 5 条记录将作为列表发送到您的触发器(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

于 2012-05-31T15:28:41.487 回答
1

如果您打算一次插入一个联系人,那么是的,您很可能会得到五倍的 SOQL 查询。但不建议以这种方式插入这些。当您提到您希望通过一次insert调用插入一组记录时,您就走在了正确的轨道上。

如果您的触发器编写正确,那么无论您插入单条记录还是 20 条记录,都应该得到相同数量的 SOQL 查询。如果查询的数量随着您插入的记录数量的增加而增加,那么触发器很可能在某种循环内有一个查询……这是一个很好的方法来首先进入调控器限制。开发触发器时请牢记Apex 代码最佳实践(参见代码示例的链接):

  • 尽可能将 SOQL 查询置于循环之外
  • 确保从触发器调用的辅助方法能够有效地操作集合
  • 自由使用 Apex 集合,以更有效地使用您无法避免的查询
于 2012-05-31T15:56:12.577 回答