Oracle和分页

fun*_*ing 6 asp.net oracle silverlight ado.net

我有一个oracle表,记录数为99896618.

我需要获取一小块数据(比方说100条记录)以在网页上显示它(在网络世界中我们称之为分页).目前我使用以下查询来完成该操作,但是用户对性能不满意.

SELECT * FROM (select rownum rnum,f.* from  findings f where rownum<90000100 ) 
                    WHERE rnum > 90000000 
Run Code Online (Sandbox Code Playgroud)

目前需要1分22秒才能得到结果.反正是为了让它变得更好.我肯定对任何类型的建议都开放,包括修改表结构或添加索引.

(仅供参考,我使用ASP.NET作为服务器端Web技术,使用ADO.NET作为数据访问层,使用Silverlight进行客户端演示)

Qua*_*noi 6

您的查询将需要计算第一个90M记录以获得下一个记录100,因此几乎没有改进的余地.

我没有ORDER BY在你的子查询中看到一个子句,但可能你有它.在这种情况下,您可能希望在其上创建索引.

还有一个问题:900K在抱怨性能之前,您的用户是否真的点击了网页?

更新:

如果您需要最新页面,则需要ORDER BY按降序重写列:

SELECT  *
FROM    (
        SELECT  rownum rnum, f.*
        FROM    findings f
        ORDER BY
                record_ordering_column DESC
        ) 
WHERE   rnum > 900
        AND rownum <= 100
Run Code Online (Sandbox Code Playgroud)

并创建一个索引 record_ordering_column

请注意,我rownum从嵌套查询中混合使用以提高性能.

有关详细信息,请参阅我的博客中的这篇文章


Ton*_*ews 5

您的一条评论:

大多数时候(大约95%的时间)用户对最后(最新)记录感兴趣

在这种情况下,为什么不以相反的顺序显示记录,以便95%的用户对第1页而不是900,000页感兴趣?

如果他们真的想看到"页面900,000",这意味着他们对很久以前的数据感兴趣,所以允许他们按日期范围过滤数据.只需在没有任何过滤的情况下分页1亿行,就不会有高效性.