2015-01-13 34 views
0

I'm使用以下模板做分页查询: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 

I'm面对其中,第一页有很好的表现(< 1秒)的情况,但是当我们从第二移动页面转发查询需要约5-6s。

  1. 任何人都可以解释我为什么是这种情况?
  2. 有没有什么办法轻微修改这个查询模板以获得更好的性能?
  3. 是否有任何完全不同的策略可以表现更好?

附加信息:

  • 我用DB2 v9.7.400.501
  • There's没有限制关键字
  • 我无法创建视图或存储过程,由于客户约束
  • 我不能创建任何额外的索引
  • 试图从rownumber()no切换()但没有改变任何东西

回答

2

您需要查看两个查询的执行计划以查看是否有任何区别 - 只有这样才能给出明确的答案。

你可以尝试重写查询,像这样:

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 
+0

欣赏答案Mustaccio。实际上,完全移除左连接使其表现非常快!但是,我不能像你所说的那样移动连接,因为在原始查询(编辑问题)中实际上有一个bbb.cde。 –

+0

实际上,我管理它通过进一步修改查询来处理您的线路。然而,我只是不知道,如果我能够修改代码来生成这样的查询,但无论如何,这是一个非常好的提示。谢谢 –

+0

是的,我做了你编辑的建议,但: 1)这将是一个代价高昂的修改重新生成这些查询 2)如果我需要按bbb.coly排序,那么我仍然需要在rownumber()查询里面的东西(好吧,我没有提到排序功能,但会编辑问题) –