2015-01-13 52 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()查詢裏面的東西(好吧,我沒有提到排序功能,但會編輯問題) –