我的表现不佳,使用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
任何想法或帮助将不胜感激。谢谢。
答案 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