2011/07/21
ガバナ制限処方箋(6):データ操作処理はまとめて実行する
先週に引き続き、複数件のデータをまとめて扱う際のポイントです。
今週はデータ操作をまとめる方法について説明します。
データ操作時に複数件のレコードに対して変更を加えたり、追加したりする場合があります。
Force.comでは、DML(insertやupdateなど)を処理する際の引数としてList/配列を渡すことができます。これによって、1件ずつinsert/updateするのではなく、データをまとめて処理する
ことで発行するDMLを減らすことができます。
以下に、効率の悪いDMLと効率の良いDMLのサンプルソースコードを示します。
効率の悪いDMLのサンプルソースコード
for(List<Account> accounts : [SELECT id, name FROM Account]) { for(Account account : accounts) { // 対象データに対する操作 account.name = account.name + ':test'; update account; } }
効率の良いDMLのサンプルソースコード
for(List<Account> accounts : [SELECT id, name FROM Account]) { for(Account account : accounts) { // 対象データに対する操作 account.name = account.name + ':test'; } update accounts; }
上記のサンプルソースコードでは、DMLを記述する場所が少しだけ異なるだけです。しかし、ガバナ制限から見ると、ループのどこでDMLを記述するかだけで大きな違いになります。
効率の悪いDMLのサンプルソースコードでは、SOQLで取得したレコード件数分だけDMLを発行します。それに対して、効率の良いDMLのサンプルソースコードでは、SOQL FORループのループ回数分だけDMLを発行することで同じ動作を実現しています。
具体的には、SOQLで
取得するレコード件数が100件であれば、効率の悪いDMLのサンプルソースコードでは100回のDMLを発行するのに対して、効率の良いDMLのサンプルソースコードでは1回のDMLを発行する
だけになります。
通常のRDBMSのSQLに慣れていると、つい効率の悪いDMLのサンプルソースコードの記述方法になってしまいがちです。Force.comに慣れないと無意識に効率の悪い書き方をしてしまいますので、注意が必要です。
「スタッフブログ」へのコメントやご意見等ありましたら、Facebookページまでお願いします。
twitterでもつぶやいてます。ご興味のある方はぜひフォロー、「いいね!」をお願いします。
(倉谷)