LimitException: слишком много строк запроса: 50001 из с агрегатной функцией count () - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть страница Visualforce, на которой я хочу отобразить количество записей в определенной таблице sObject.

На странице Visualforce у меня будет что-то довольно простое, например:

<p>Client Account Count: {!ClientAccountCount}</p>

Тогда в контроллере:

// Return the number of clients
public integer getClientAccountCount() {
    return [Select count() from Account where SomeCustomField__c = 'Client' limit 50000];
}

Я думал, что с предложением limit в SOQL все будет в порядке, так как он будет возвращать максимум 50 000. Однако на практике я все еще получаю это исключение в производственной организации:

09: 29: 12: 179 SOQL_EXECUTE_BEGIN [108] | Агрегатирования: 0 | выберите количество () из учетной записи, где SomeCustomField__c = «Клиент» лимит 50000

09: 29: 12: 331 EXCEPTION_THROWN [108] | System.LimitException: слишком много строк запроса: 50001

Есть ли безопасный способ выполнить этот запрос, который не приведет к исключению, которое я не смогу отловить?

Как ни странно, если я попробую следующее как анонимный апекс в работе, он будет работать нормально и вернет 50 000.

integer count = [select count() from Account where SomeCustomField__c = 'Client' limit 50000];

Возможно, проблема в совокупном количестве строк запросов по всем операциям, которые вызывают проблему, и мне нужно проверить ограничения в коде перед выполнением запроса?


На форумах Force.com есть похожий пост - Слишком много строк запросов в функции COUNT (*) . Я не могу настроить страницу VF только для чтения, чтобы увеличить предел строки запроса.

1 Ответ

6 голосов
/ 03 апреля 2012

Doh! Я почти уверен, что мне нужно проверить совокупное количество записей, полученных запросами SOQL для запроса. Таким образом, в то время как один запрос SOQL может получить до 50 000 записей, две не могут выполнить 50 000 каждой.

Думаю, я могу использовать Limits.getQueryRows () и Limits.getLimitQueryRows () , чтобы отключить запросы SOQL, если требуется.


Я изменил способ работы метода getClientAccountCount (). Я полагаю, что только каждый сможет дать представление о количестве строк, так как агрегатные функции ограничены.

// Return the number of ad book clients
public string getClientAccountCount() {
    System.debug(LoggingLevel.Debug, 'getClientAccountCount() - Current Query Rows: ' + Limits.getQueryRows() + '/' + Limits.getLimitQueryRows());
    integer recordCount = [Select count() from Account where SomeCustomField__c = 'Client' limit 1001];
    if(recordCount == 1001) { return '1000+'; }
    return string.valueOf(recordCount);
}

Эта идея - Подсчет запроса SOQL count () как запроса в одну строку , кажется, стоит продвигать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...