ApexではStandardSetControllerを使用することで簡単にページネーション機能を実装することができます。この方法を使った時、最大何件のレコードまで表示できるか確認してみました。
まず大量データの表示を行いたい場合は、『readOnly=true』の宣言が必要です。これにより通常の上限1000件を超えて表示することが可能になります。
※レコードの表示なら50000件、件数だけならそれ以上が可能になります。
StandardSetControllerを使ったページネーション機能を実装する場合はクエリは『Database.getQueryLocator(query)』というように実行します。
最大50000件まで表示できるようになるreadOnlyを宣言していてもDatabase.getQueryLocatorで取得できる件数の上限は10000件までとなっていました。
ということで..10000件以上の件数表示が必要なページネーション機能を実装する場合は、StandardSetController以外のやり方での対応が必要になるみたいです。
ちなみにDatabase.getQueryLocator(query)の結果はApexPages.StandardSetcontroller型として受け取ることになります。そのため実際に画面に表示する際にはgetRecords()を使ってsObject型に変換する必要があります。
このgetRecords()で取得できるレコードは全件ではなくsetPageSize()で指定した件数となります。レコード件数の確認には使用できないので注意が必要です。
今回の検証用に作成したサンプルコードです。
追記
上限の10000件を表示した場合のビューステートを確認してみました。結果は約5KBでガバナ制限でエラーになる135KBまでまだまだ余裕がありました。