我有一个使用服务器端分页的简单查询。问题是 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 数据表插件中,这对服务器端分页之类的事情有很大帮助。但是,它需要服务器返回总记录的值才能正确显示分页控件。
最好的方法是什么?(注:PHP)
我想如果立即用假的(估计会更好)行数返回第一页。加载页面后,对确定查询总行数的方法进行 ajax 调用(如果在此期间用户页面会发生什么情况?),然后更新伪造/估计的总行数。
但是我不知道如何进行估算。我用 SAMPLE (0.1) 尝试了 count(*) * 1000,但无论出于何种原因,它实际上比完整计数查询花费的时间更长。也只是返回一个假/随机值似乎也有点 hacky。它需要大于 1 个页面大小,以便启用“下一步”按钮。
其他想法?