2011年5月19日 星期四

從資料庫一次取太多筆會造成AP SERVER記憶體空間不夠

記得以前在金融公司資訊部上班時
金融業都很講求效率
比如在資料庫下SQL, 不能執行太久,
否則DB的效能都被你吃完, 別人就吃得少或吃不到了
所以每個星期會公布SQL COST前五名的SQL
以茲獎....哦不, 是以茲改進
改進的方式是改變SQL的本身
通常都是條件下得不夠漂亮
或者真的資料量爆大
必須要增加INDEX
或者是根本沒有條件
造成他一次取回資料表的全部資料
這也是今天的主題

如果一次取回的資料太多筆
則不但DB會效能低落
連AP SERVER也是
那時如果一次取十萬筆資料回來
AP SERVER會發出OUT OF MEMORY的錯誤訊息
因為你取資料回來時
是以RESULTSET的型式放在AP SERVER上
取回的東西多, RESULTSET就越大到記憶體空間不足

在DB層面也是
操作DBMS時, 比如TOAD
對一個有龐大資料的資料表
如果直接下SQL不加任何條件
那它顯示查詢結果畫面的時間
就會處理得很久
你可以想像從一家滿滿的麵包店拿十個麵包
跟掃光全店的所有麵包
哪個時間會花得比較久?

所以我們知道不能"一次"取"太多筆"資料回來
否則會造成AP SERVER和DB這兩層TIER
處理速度變慢且記憶體不夠用

但是有時真的有這個需求, 怎辦
我就是有取大量資料的需求
這時可以透過JDBC裡定義的executeBatch()
它先將所有要執行的語句用addBatch()加入容器中
最後executeBatch()時就一次送出全部的句子

之前上課聽老師說
有人執行大量的資料庫異動
用傳統的execute()花了一個星期還沒好
使用了executeBatch(), 十個小時就好了

但是這個executeBatch()可以拿來做批次異動
卻好像不適用於select語法??
之前公司有個套件
你可以設定每次要取回的資料筆數
它會自動當你分成一批一批地取回
也避免了一次取大量資料的問題
只是不知道JDBC有無對應的現成方法?

沒有留言:

張貼留言