2010-10-05 29 views
1

編輯:這個例子很糟糕,導致與問題無關的答案。 給定一個大的選擇查詢,在一個簡單的程序,如:將選擇查詢拆分爲塊的目的?

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  
            ResultSet.CONCUR_READ_ONLY); 
ResultSet srs = stmt.executeQuery(
    "SELECT AGE FROM USERS"); 
while (srs.next()) { 
     ageStdDevAccumulator += Math.Pow(averageAge - srs.getInt("AGE"),2); 
} 
int ageStdDev= Math.Sqrt(ageStdDevAccumulator/userCount); 

我明白,一旦被的executeQuery跑,然後用戶青睞的整列從數據庫發送到程序。是對的嗎?如果數據庫中的用戶太多,這會導致服務器上的內存溢出嗎?如果是這樣,那麼可以將選擇查詢分解爲更小的塊?如果是這樣,可以讓編譯器自行解決這個問題?

謝謝, 數據庫noob程序員。

+3

下面簡單的查詢

SELECT AVG(AGE)這是如何不做事一個很好的例子 - 你的方法得到數據庫中的行並逐個遍歷它們,給數據庫帶來不必要的壓力(沒有東西會溢出),但是直接返回結果的查詢可以通過查看索引來完成您所需要的操作(在幾個I/O操作)你的方法需要f(n)I/O操作,其中n是行數。即使你沒有索引,查詢方法也會快得多。所以不需要「拆分」查詢。另外,編譯器不知道數據庫中的數據。 – Unreason 2010-10-05 23:45:13

+0

因此每個「getInt」觸發IO操作? executeQuery只執行一些管理操作,但不會將任何實際的年齡信息從數據庫傳輸到服務器?所以這不會給服務器的內存使用帶來任何壓力? – KeyboardDrummer 2010-10-06 00:05:00

+0

@ user93197,我認爲它是'srs.next()'實際上執行IO操作 - 我期望'srs.getInt'從緩衝區讀取。至於服務器上的內存使用情況 - 返回一行作爲答案的查詢很可能比使用返回整個數據集的查詢少得多的服務器內存。它也看起來好像你已經運行了一個查詢來返回'averageAge'和'userCount' - 如果沒有,你會在哪裏得到這些值? – 2010-10-06 12:35:41

回答

6

如果我計算平均用戶,我會做的來自用戶的