db2分页查询性能

时间:2015-01-13 17:51:19

标签: performance pagination db2

我正在使用以下模板进行分页查询:

select * from (select rownumber() over
( order by aaa.x ) as rownum,  aaa.abc, aaa.bcd,bbb.cde from aaa as aaa 
left join bbb on aaa.colx= bbb.coly where aaa.where1 = 'xxx'
) as tempresult where rownum between 101 and 200

假设页面大小为100个项目,则第一页查询将是相同的,替换rownum条件:

where rownum <= 100

我面临的情况是第一页表现非常好(&lt; 1s),但是当我们从第二页向前移动时,查询大约需要5-6秒。

  1. 任何人都可以解释我为什么会这样吗?
  2. 有没有办法轻微修改此查询模板以获得更好的性能?
  3. 是否有任何完全不同的策略可以表现得更好?
  4. 其他信息:

    • 我使用DB2 v9.7.400.501
    • 没有限制关键字
    • 由于客户约束,我无法创建视图或存储过程
    • 我无法创建任何其他索引
    • 尝试从rownumber()切换没有rank()但它没有改变任何东西

1 个答案:

答案 0 :(得分:2)

您需要查看两个查询&#39;执行计划,看看是否有任何差异 - 只有这可以给你一个明确的答案。

您可以尝试重写查询,如下所示:

select * from (
  select rownumber() over ( order by aaa.x ) as rownum,  aaa.abc, aaa.bcd 
  from aaa as aaa 
  where aaa.where1 = 'xxx'
) as tempresult 
left join bbb on tempresult.colx= bbb.coly 
and tempresult.rownum between 101 and 200

修改

在最终选择中,没有什么可以阻止您使用bbb中的列:

select tempresult.*, bbb.cde 
from (
  select rownumber() over ( order by aaa.x ) as rownum,  aaa.abc, aaa.bcd 
  from aaa as aaa 
  where aaa.where1 = 'xxx'
) as tempresult 
left join bbb on tempresult.colx= bbb.coly 
and tempresult.rownum between 101 and 200