3

特定の sObject テーブルのレコード数を表示したい Visualforce ページがあります。

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];
}

SOQL の limit 句を使用すると、毎回最大 50,000 しか返されないので問題ないと思いました。ただし、実際には、本番組織ではまだこの例外が発生します。

09:29:12:179 SOQL_EXECUTE_BEGIN [108]|Aggregations:0|Select count() from Account where SomeCustomField__c = 'Client' limit 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 ページを読み取り専用に設定して、クエリ行の制限を増やすことができません。

4

1 に答える 1

6

どっ!リクエストの SOQL クエリによって取得されたレコードの累積数を確認する必要があると確信しています。したがって、1 つの SOQL クエリで最大 50,000 レコードを取得できますが、2 つのクエリでそれぞれ 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() クエリを単一行クエリとしてカウントすることは、促進する価値があるようです。

于 2012-04-02T22:04:39.587 に答える