2

設定:

作成して頂点に達する5つのContactsObjectがあるとします。連絡先を一度に1つずつ挿入すると、トリガーなどを使用してx個のsoqlクエリが実行されます。

質問:

  1. したがって、各連絡先をコードに一度に1つずつ挿入すると、5倍のsoqlクエリが得られます(右?)。

  2. ここで、これらの5人を配列に入れ、1つの挿入を使用して配列を挿入するとします。soqlクエリはいくつありますか?

  3. 2に関しては、5倍だとしたら、なぜわざわざするのでしょうか。では、DMLの数を4つ減らすことができますか?

ありがとう、

半新しい男

4

2 に答える 2

6

特定のコードブロックと、そのために実行されるすべての同期apexコードは、単一の実行コンテキストで評価されます。つまり、ガバナー制限の単一のセットがあります。与えた例では、Contactトリガーが3つのSOQLクエリと1つのDMLステートメントを作成するとします。各連絡先を個別に挿入した場合は、5つのDMLステートメント(各連絡先の挿入に1つ)+各トリガーに1つのDMLステートメント、および各トリガーに3 * 5つのSOQLステートメントを使用し、合計15のSOQLステートメントと10のDMLになります。コードのステートメント。ただし、それらをリストとして挿入した場合、5つのレコードすべてがリストとしてトリガー(1つのDMLステートメント)に送信され、トリガーは3つのSOQLクエリと1つのDMLステートメントを1回実行し、合計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

連絡先を一度に1つずつ挿入する場合は、そうです。ほとんどの場合、SOQLクエリの数は5倍になります。ただし、これらをこの方法で挿入することはお勧めしません。insert1回の呼び出しでレコードのコレクションを挿入したいと言ったとき、あなたは正しい方向に進んでいます。

トリガーが正しく記述されている場合は、単一のレコードを挿入する場合でも20のレコードを挿入する場合でも、同じ数のSOQLクエリを実行する必要があります。挿入するレコードの数に応じてクエリの数が増える場合、トリガーには、ある種のループ内にクエリがある可能性があります...これは、ガバナーの制限に真っ向から取り組むための優れた方法です。トリガーを開発するときは、Apexコードのベストプラクティスを念頭に置いてください(コードサンプルについては、リンクを参照してください)。

  • 可能な限り、SOQLクエリをループの外側に保持します
  • トリガーから呼び出されたヘルパーメソッドがコレクションを効率的に操作できることを確認します
  • Apexコレクションを自由に使用して、回避できないクエリをより効率的に使用します
于 2012-05-31T15:56:12.577 に答える