サーバー側のページネーションを使用した簡単なクエリがあります。問題は、WHERE句が高価な関数を呼び出し、関数の引数がユーザー入力であることです。ユーザーが探しているもの。
SELECT
*
FROM
( SELECT /*+ FIRST_ROWS(numberOfRows) */
query.*,
ROWNUM rn FROM
(SELECT
myColumns
FROM
myTable
WHERE expensiveFunction(:userInput)=1
ORDER BY id ASC
) query
)
WHERE rn >= :startIndex
AND ROWNUM <= :numberOfRows
numberOfRows が小さいと仮定すると、これは機能し、迅速です。ただし、クエリの合計行数も知りたいです。ユーザー入力とデータベースのサイズによっては、クエリに数分かかる場合があります。私の現在のアプローチは、この値をキャッシュすることですが、それでもユーザーは最初の結果が表示されるまで数分待つ必要があります。
結果は Jquery datatables プラグインに表示され、serer 側のページングなどに非常に役立ちます。ただし、ページング コントロールを正しく表示するには、サーバーが合計レコードの値を返す必要があります。
最善のアプローチは何ですか?(注:PHP)
最初のページをすぐに偽の (より良いと推定される) 行数で返すと思いました。ページがロードされた後、クエリの合計行数を決定するメソッドへの ajax 呼び出しを実行し (その間にユーザーがページを表示するとどうなるでしょうか?)、偽造/推定された合計行数を更新します。
しかし、見積もりの仕方がわかりません。SAMPLE (0.1) で count(*) * 1000 を試してみましたが、何らかの理由で実際にはフルカウントクエリよりも時間がかかります。また、偽の/ランダムな値を返すだけでも少しハッキーに思えます。[次へ] ボタンを有効にするには、1 ページ サイズよりも大きくする必要があります。
他のアイデア?