您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在Oracle中加快row_number的速度?

如何在Oracle中加快row_number的速度?

ROW_NUMBER的效率很低Oracle

有关性能的详细信息,请参见我的博客中的文章

对于您的特定查询,建议您将其替换为ROWNUM并确保使用索引:

SELECT  *
FROM    (
        SELECT  /*+ INDEX_ASC(t index_on_column) NOPARALLEL_INDEX(t index_on_column) */
                t.*, ROWNUM AS rn
        FROM    table t
        ORDER BY
                column
        )
WHERE rn >= :start
      AND rownum <= :end - :start + 1

查询将使用 COUNT STOPKEY

另外,请确保您column不可为空,或添加WHERE column IS NOT NULL条件。

否则,索引不能用于检索所有值。

请注意,ROWNUM BETWEEN :start and :end没有子查询就无法使用。

ROWNUM总是最后被分配并最后检查,这就是方法ROWNUM总是无间隙地排列。

如果您使用ROWNUM BETWEEN 10 and 20,则满足所有其他条件的第一行将成为返回的候选项,并被临时分配ROWNUM = 1并通过的测试失败ROWNUM BETWEEN 10 AND 20

然后,下一行将是候选行,并分配有ROWNUM = 1和失败等,因此,最后,将根本不返回任何行。

应该通过将ROWNUM放入子查询中来解决此问题。

Oracle 2022/1/1 18:36:08 有428人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶