【问题标题】:db2 pagination query performancedb2 分页查询性能
【发布时间】:2015-03-11 18:36:53
【问题描述】:

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

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

我面临的情况是第一页执行得非常好(

  1. 谁能解释一下为什么会这样?
  2. 有什么方法可以稍微修改这个查询模板以获得更好的性能?
  3. 是否有任何完全不同的策略可以表现得更好?

附加信息:

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

【问题讨论】:

    标签: performance pagination db2


    【解决方案1】:

    您将需要查看两个查询的执行计划,看看是否有任何差异——只有这样才能给您一个明确的答案。

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

    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
    

    【讨论】:

    • 欣赏答案Mustaccio。实际上,完全删除左连接使它执行得非常快!但是,我不能像你说的那样移动连接,因为原始查询中实际上有一个 bbb.cde(已编辑问题)。
    • 实际上,我通过进一步修改查询来管理它在您的线路上工作。但是,我只是不知道是否能够修改代码以生成这样的查询,但无论如何,这是一个非常好的提示。谢谢
    • 是的,我做了你的编辑建议,但是:1)这将是对代码进行高成本修改以重新生成这些查询 2)如果我需要按 bbb.coly 排序,那么我会在 rownumber() 查询中仍然需要那个东西(好吧,我没有提到排序功能,但会编辑问题)
    猜你喜欢
    • 2013-04-12
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多