2012-04-02 6 views
3

Ich habe eine Visualforce-Seite, auf der ich die Anzahl der Datensätze in einer bestimmten sObject-Tabelle anzeigen möchte.LimitException: Zu viele Abfragezeilen: 50001 von mit count() Aggregatfunktion

In der Visual Seite ich etwas ziemlich einfach, wie haben würde:

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

Dann in der Steuerung:

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

Ich dachte, mit der Limit-Klausel in dem SOQL ich würde gut, da es nur jede Rückkehr ein Maximum von 50.000 geben würde. Doch in der Praxis bekomme ich immer noch diese Ausnahme bei der Herstellung org:

09: 29: 12: 179 SOQL_EXECUTE_BEGIN [108] | Aggregationen: 0 | select count() von Konto, wo SomeCustomField__c = 'Client' Grenze 50000

09: 29: 12: 331 EXCEPTION_THROWN [108] | System.LimitException: zu viele Abfragen Zeilen: 50001

gibt es einen sicheren Weg, um diese Abfrage auszuführen, die nicht zu einer Ausnahme führen werden, dass Ich kann nicht fangen?

Seltsamerweise, wenn ich folgendes als anonymer Apex in der Produktion versuche, funktioniert es gut und gibt 50.000 zurück.

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

Vielleicht ist das Problem ist die kumulative Anzahl der Abfragezeilen über alle Vorgänge, die das Problem verursacht, und ich brauche, um die Limits in Code zu überprüfen, bevor die Abfrage ausgeführt wird?


Es gibt eine ähnliche Position auf den Diskussionsforen Force.com - Too many query rows on COUNT(*) function. Ich kann nicht festlegen, dass die VF-Seite nur gelesen wird, um das Zeilenlimit für Abfragen zu erhöhen.

Antwort

6

Doh! Ich bin mir ziemlich sicher, dass ich die kumulative Anzahl der Datensätze überprüfen muss, die von SOQL-Abfragen für die Anforderung abgerufen werden. Während also eine SOQL-Abfrage bis zu 50.000 Datensätze erhalten kann, können zwei nicht 50.000 pro Datensatz ausführen.

Rate ich kann Limits.getQueryRows() and Limits.getLimitQueryRows() verwenden, um die SOQL-Abfragen bei Bedarf zu deaktivieren.


Ich habe die Methode getClientAccountCount() geändert. Ich denke, es wird nur jeder in der Lage sein, einen Hinweis darauf zu geben, wie viele Zeilen es gibt, da die Aggregatfunktionen begrenzt sind.

// 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); 
} 

Diese Idee - Count the SOQL count() query as a single row query scheint Förderung wert.

+0

Ja, ich stimme zu. Beförderte diese Idee auch. Also, wie finde ich die Anzahl der Datensätze in einer SObject-Tabelle mit einer SOQL-Abfrage? –

+0

@KirillYunussov. Sie können einen Stapeljob erstellen, der alle Datensätze in einer Tabelle durchläuft und die Gesamtzahl der Datensätze akkumuliert. Es wäre nicht sehr effizient oder schnell, aber Sie würden schließlich die Gesamtzahl der Datensätze erhalten (weniger Änderungen, die während des Prozesses aufgetreten sind). –