2011-09-08 213 views
0

我需要從包含1kkk行的表上的java代碼執行SELECT查詢,因此結果集將接近1kk行。這就是爲什麼我需要限制它,並多次運行選擇查詢,每次只檢索10k行。我得到10k行後,我更新它,所以在下一個選擇他們不會被檢索。 問題是 - 在每個選擇oracle從表中的第一行看,所以它降低了性能。 如何使用OFFSET避免Oracle從第一行開始查看並傳遞已更新的行?在ORACLE中使用OFFSET SELECT查詢

+0

你想做什麼?我無法想象用戶瀏覽這些結果。我無法想象一個批處理流程 – Rene

+0

爲什麼您需要限制更新的結果集?在提交之前,我經常運行一次影響數百萬行的更新語句。 – Wolf

+0

是不可能識別已經更新的行並忽略它們?也許存儲一個批號更新記錄 –

回答

8

這些解決方案實際上都沒有改善性能。

您已獲得250,000行數據集並以10,000批爲單位獲取它們。 除非你有一個到數據庫的有狀態連接並且保持SELECT語句正在進行(用oracle語言來說這是'保持光標打開'),那麼每個select都是獨立於最後一個的。

因此,如果要將批次從180,001提取到190,000,它仍然必須進行排序才能計算出前190,000行。句法糖(如OFFSET)不會改變數學和邏輯的基本規則。

爲了獲得最佳性能,您需要保持結果集處於打開狀態並只保留從中獲取行。不要關閉它,不要重新發出選擇。

+0

嗨,Gary。我甚至不能在java代碼中創建結果集,因爲它將包含100多萬行,所以我需要多次使用SELECT查詢以批處理10.000行的方式獲取它。 SELECT的最後一次將從第一行開始傳遞。 – Demoniac18

+0

Connection.setFetchSize允許您告訴JBDC驅動程序您希望一次獲取多少行。嘗試將所有內容都獲取到RowSet中肯定會導致問題,但Oracle的JDBC驅動程序非常聰明,無法讀取不需要的行,並且我沒有任何問題通過一次調用Statement來遍歷4000萬行查詢結果。 query()和4000萬次調用ResultSet.next() –