SQL ROWNUMBER效率

时间:2017-04-24 18:36:21

标签: sql db2 row-number

我的表现不佳,使用ROWNUMBER函数进行分页。页面大小先前已设置为5000但已更改为100.在我在较低环境中的测试中,此更改后响应时间从7秒降至1秒以下。

但是,由于查询没有太多过滤器,因此,例如,如果谓词中的LAST_UPD_DT设置为今天,则可能会发生全表扫描。

那么在这种情况下,将ROWNUMBER设置为低得多的值会有所帮助还是没有什么区别?

在制作中有大约250万条记录,在测试中大约有5k,我看到响应从7s下降到1s以下。

该查询使用与谓词具有相同列的索引。 ORIG_TIME列目前没有索引,但会添加。数据库是DB2。

以下是查询的精简版本,它保留了问题的基本要点。

    SELECT  * 
    FROM 
      ( 
        SELECT  ROWNUMBER ( ) OVER ( 
        ORDER BY MEMBERS.ORIG_TIME ASC ), 
              MEMBERS.APP_ID, 
              MEMBERS.NAME
        FROM MEMBERS 
        WHERE 
            MEMBERS.LAST_UPD_DT <= ? AND 
            ( MEMBERS.STAT_CD = 'S' OR MEMBERS.CURR_STAT = 'D' ) 
        ORDER BY MEMBERS.ORIG_TIME ASC 
      ) 
      AS TEMP_ 
    WHERE ROWNUMBER_ <= 100  --used to be 5000

任何想法或帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

添加您的索引并纠正您的查询:

SELECT  * 
FROM 
  ( 
    SELECT  ROWNUMBER ( ) OVER (ORDER BY MEMBERS.ORIG_TIME ASC ) as RANG, 
            MEMBERS.APP_ID, MEMBERS.NAME
    FROM MEMBERS 
    WHERE 
    MEMBERS.LAST_UPD_DT <= ? AND ( MEMBERS.STAT_CD = 'S' OR MEMBERS.CURR_STAT = 'D' ) 
  ) 
  AS TEMP
WHERE RANG between 1 AND 5000 -- Modify here your range
order by RANG