You need to sign in to do that
Don't have an account?
OginoMai
【Apex heap size too large】SOQL文でのデータの持ち方について
バッチ処理を実行すると、【Apex heap size too large】とエラーが発生します。
そこで、SOQL文を見直したのですがエラーは変わりませんでした。
※Account(取引先)は約2,300件ほど。
見直し前)
'SELECT ' + util.getAllItem('Account') + ' FROM Account
※util.getAllItemと言う関数は、全てのAccount項目を取得する関数との事です。(最下部貼り付けております。)
※アカウント項目は全部で187項目。
見直し後)
'SELECT ' + util.getAllItem('Account') + ' FROM Account WHERE (uniNumber__c >= \'0000000001\' AND uniNumber__c <= \'0000001000\')';
見直し前と後では、取得するレコード数には大きく差がある(1,000件以上)と思うのですが、
なぜか【Apex heap size too large】が引き続き発生している状況です。
上記見直し後のSOQL文も、最初に全Account(取引先)データを取得してしまうのでしょうか?
何かご存知の方がいらっしゃいましたら、少しでもご教授頂けますと幸いです。
どうぞよろしくお願いいたします。
■util.getAllItem■
Utilクラス
public String getAllItem(String obj){
Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe() ;
Schema.SObjectType s = m.get(obj) ;
Schema.DescribeSObjectResult r = s.getDescribe() ;
Map<String, Schema.SObjectField> fields = r.fields.getMap() ;
string soql = '';
for (String fieldName : fields.keyset()) {
if (soql != '') {
soql += ', ';
}
soql += fieldName;
}
return soql;
}
そこで、SOQL文を見直したのですがエラーは変わりませんでした。
※Account(取引先)は約2,300件ほど。
見直し前)
'SELECT ' + util.getAllItem('Account') + ' FROM Account
※util.getAllItemと言う関数は、全てのAccount項目を取得する関数との事です。(最下部貼り付けております。)
※アカウント項目は全部で187項目。
見直し後)
'SELECT ' + util.getAllItem('Account') + ' FROM Account WHERE (uniNumber__c >= \'0000000001\' AND uniNumber__c <= \'0000001000\')';
見直し前と後では、取得するレコード数には大きく差がある(1,000件以上)と思うのですが、
なぜか【Apex heap size too large】が引き続き発生している状況です。
上記見直し後のSOQL文も、最初に全Account(取引先)データを取得してしまうのでしょうか?
何かご存知の方がいらっしゃいましたら、少しでもご教授頂けますと幸いです。
どうぞよろしくお願いいたします。
■util.getAllItem■
Utilクラス
public String getAllItem(String obj){
Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe() ;
Schema.SObjectType s = m.get(obj) ;
Schema.DescribeSObjectResult r = s.getDescribe() ;
Map<String, Schema.SObjectField> fields = r.fields.getMap() ;
string soql = '';
for (String fieldName : fields.keyset()) {
if (soql != '') {
soql += ', ';
}
soql += fieldName;
}
return soql;
}
取引先の項目を全て取得する処理を利用されていますが、バッチ処理内で必要な項目のみ取得するように変更することでエラーを回避できないでしょうか。
All Answers
取引先の項目を全て取得する処理を利用されていますが、バッチ処理内で必要な項目のみ取得するように変更することでエラーを回避できないでしょうか。
>取引先の項目を全て取得する処理を利用されていますが、バッチ処理内で必要な項目のみ取得するように変更することでエラーを回避できないでしょうか。
こちらの件、承知いたしました。
バッチ処理で必要な項目を洗い出し、まずは変更してみることを試してみます。
レコード件数は関係なさそうとの事で、こちらは非常に安心いたしました。
ありがとうございました。