程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 淺析:Oracle jdbc分頁效率的測試

淺析:Oracle jdbc分頁效率的測試

編輯:Oracle數據庫基礎

經過長時間學習Oracle,現在就關於Oracle jdbc分頁效率的測試和大家分享一下,希望看完本文的你肯定有不少收獲。

先寫了一個最簡單的jdbc分頁測試,在100萬記錄的情況下對數據庫進行absolute定位操作,從20萬開始取1頁記錄大約是5秒,但是再往上面加,比如40萬開始就內存溢出了。這就說明Oracle的jdbc在用absolute的時候確實是要逐行讀取數據的。另外發現,設置fetchsize ,速度會有10%左右的提高。

然後改用Oracle 自身的 rownum的方式進行分頁測試.

  1. SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM demo_table) A WHERE ROWNUM <= 200010) WHERE RN >= 200000  

執行速度確實快了一些, 大約在2-3秒之間。但是這種方式應該是越到後面越慢,果然從90萬位置開始取, 大約是在13秒左右。這樣一來,修改實現方式好像就是必須的了, 但是奇怪的是,使用ibatis的分頁並沒有什麼內存溢出的問題,100萬記錄到最後一頁,感覺上大概也是10多秒。

看了一下ibatis的queryForList這個方法, debug了一下, 發現他有個判斷, 對於forward_only的類型的resultset 是用循環next來定位的(記得以前自己的分頁實現裡面為了兼容性也做了這樣的處理),而不是我誤以為的absolute方式。

看來Oracle的jdbc 對於forward_only的resultset做 next方法是不會產生真正的讀取操作。 用jdbc 測試了一下,果真如此。 從90萬記錄開始取,沒有出現內存溢出的問題,執行時間大約22秒左右。不知道這種差別在MySQL和db2上是否也是如此,下次有時間再做一個測試看看。至於next和rownum執行效率的差距, 我估計是前者必須用游標順序定位。

現在的問題就是, 兩者比較, 執行時間只相差一倍而已,還是一個數量級別的,就為了這個做修改,還導致sql不可以跨數據庫,好像一點都不值得。甚至如果用戶不直接翻到最後幾頁,根本感覺不到速度差別。後來想想,老外有時候也是腦子壞了, 什麼樣的項目會需要你沒事去翻上百萬記錄。還是保持原狀,丟在哪再說吧

測試環境:Oracle9i 2版, 西文字符集。沒對其他參數進行測試。

以上就Oracle jdbc分頁效率的測試講了個簡單的例子,要想了解的更多相關問題的解決方案,請留意51cto.com站上的相關帖子。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved