2011/07/21 19:06:13

ガバナ制限処方箋(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でもつぶやいてます。ご興味のある方はぜひフォロー、「いいね!」をお願いします。

(倉谷)

admin
Page topへ