暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在大表上分页的有效方法是什么?

ASKTOM 2019-06-30
368

问题描述

嗨,汤姆,

我们在java应用程序中使用以下查询,以便在分页中获取查询结果。为了加快任务速度,我们同时执行15个查询。查询在不同的计算机上执行,但针对数据库中的同一表。请注意: 在我们的情况下,我们只是分页那些具有主键的表,我们不使用任何表之间的连接。

SELECT 
  subquery.id, subquery.column1 ... 
  FROM
    (
      SELECT 
        large_rows.id, large_rows.column1, ... ROW_NUMBER() 
          OVER 
            (ORDER BY id ASC) 
              AS 
                row_number 
                  FROM 
                    
                      ) 
                        subquery 
                          WHERE 
                            row_number 
                              BETWEEN 
                                 
                                  AND 
                                    ;



当这些查询针对具有20亿多个记录的大表执行时,我们会收到以下错误:

ORA-01652: unable to extend temp segment in tablespace  


当我们尝试在SQL DEVELOPER上执行查询时,似乎花了很长时间,即使是对于起始页,因此我们通过以下查询更改了上述查询:

SELECT /*+ ordered use_nl(p s) */
    s.id, s.column1...
FROM
    (
        SELECT
           ROWNUM RN,
           RD
        FROM
            (
                SELECT
                    ROWID RD
                FROM
                    
               ORDER BY
               .id
            ) T
        WHERE
            ROWNUM < 2000
    ) P,
    large_rows S
WHERE
    RN > 1
    AND P.RD = S.ROWID; 


此查询执行速度比上一个更快。

您能否建议此查询对ORA-01652有效?在这种情况下,还有比上面更好的查询吗?我们是否可以在不使用order by子句的情况下对查询结果进行分页 (认为由于order by子句可能会再次导致此问题)?

专家解答

我们需要知道正在使用什么执行计划。

这个视频将告诉你要找什么



文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论