こんにちは、アンダーソンです。
今回SOQLの発行カウントの条件について少し気になることがあったので調べてみました。
ガバナ制限におけるSOQL
まずおさらいしておきましょう。
1トランザクションでのSOQLの呼び出しは100回です。
それを超えると下記のようなエラーが出ますね。
System.LimitException: Too many SOQL queries: 101
さて今回試したいのは、SOQLはSOQLでもサブクエリだったり、WHERE句内で使うSOQL、forループで直接使うSOQL
と様々あるけど全てカウントされるのかを確認したいということです。
では早速みていきます。
SOQL
まず普通に発行します。
system.debug([SELECT Id FROM Account]);
system.debug(limits.getQueries());
この結果は当然1です。
サブクエリ
次はサブクエリを追加します。
system.debug([SELECT Id,(SELECT Id FROM Contacts) FROM Account]);
system.debug(limits.getQueries());
どうせ2なんだろ。。。って思ってたら違いました。
まさかの1でした。
Where句内
次はWhere句内での条件に使うSOQLを発行します。
system.debug([SELECT Id FROM Account Where Id IN (SELECT AccountId FROM Contact WHERE AccountId != null)]);
system.debug(limits.getQueries());
またまたどうせ2なんだろ。。。って思ってたら
まさかまさかのこれも1でした。
SOQL for ループ
なんとなく結果はわかってますよ。でもやってみます。
for ( Account acc : [SELECT Id FROM Account LIMIT 100] ) {
system.debug(acc);
}
system.debug(limits.getQueries());
これはもしや0とかあんじゃね?って思いましたが
はい1です。
まとめ
びっくりするくらい簡単な実験でしたが、サブクエリやWhere句でのSOQLをうまく使えば
クエリの発行数を抑えることができそうですね。
このようなことも頭に入れて実装していきたいですね。
コメント