我需要從包含1kkk行的表上的java代碼執行SELECT查詢,因此結果集將接近1kk行。這就是爲什麼我需要限制它,並多次運行選擇查詢,每次只檢索10k行。我得到10k行後,我更新它,所以在下一個選擇他們不會被檢索。 問題是 - 在每個選擇oracle從表中的第一行看,所以它降低了性能。 如何使用OFFSET避免Oracle從第一行開始查看並傳遞已更新的行?在ORACLE中使用OFFSET SELECT查詢
回答
這些解決方案實際上都沒有改善性能。
您已獲得250,000行數據集並以10,000批爲單位獲取它們。 除非你有一個到數據庫的有狀態連接並且保持SELECT語句正在進行(用oracle語言來說這是'保持光標打開'),那麼每個select都是獨立於最後一個的。
因此,如果要將批次從180,001提取到190,000,它仍然必須進行排序才能計算出前190,000行。句法糖(如OFFSET)不會改變數學和邏輯的基本規則。
爲了獲得最佳性能,您需要保持結果集處於打開狀態並只保留從中獲取行。不要關閉它,不要重新發出選擇。
嗨,Gary。我甚至不能在java代碼中創建結果集,因爲它將包含100多萬行,所以我需要多次使用SELECT查詢以批處理10.000行的方式獲取它。 SELECT的最後一次將從第一行開始傳遞。 – Demoniac18
Connection.setFetchSize允許您告訴JBDC驅動程序您希望一次獲取多少行。嘗試將所有內容都獲取到RowSet中肯定會導致問題,但Oracle的JDBC驅動程序非常聰明,無法讀取不需要的行,並且我沒有任何問題通過一次調用Statement來遍歷4000萬行查詢結果。 query()和4000萬次調用ResultSet.next() –
- 1. 在SELECT查詢中使用*
- 2. 在mysql查詢的SELECT中使用SELECT
- 3. Sqlite LIMIT/OFFSET查詢
- 4. d3 select offset parent
- 5. PostgreSQL;在INSERT中使用SELECT子查詢
- 6. MySQL查詢 - 在更新中使用SELECT
- 7. 在UPDATE查詢中使用select sub
- 8. 不能在LINQ查詢中使用select
- 9. 在SQL查詢中使用JQuery變量作爲OFFSET
- 10. 我可以在INSERT查詢中使用SELECT子查詢嗎?
- 11. 使用SELECT MySQL查詢
- 12. 在SELECT查詢
- 13. 在SELECT查詢
- 14. 對另一個SELECT查詢使用knex SELECT查詢結果
- 15. 「SELECT ... IN(SELECT ...)」 查詢CI中
- 16. 現有查詢中使用select語句
- 17. 總用select查詢
- 18. 在MySQL Select查詢
- 19. SQL SELECT查詢中
- 20. MySQL select查詢
- 21. SQL查詢使與內SELECT
- 22. UPDATE查詢中的SELECT子查詢
- 23. INSERT查詢中的嵌套查詢:SELECT
- 24. 爲select查詢
- 25. SQL SELECT查詢
- 26. SELECT查詢
- 27. SQL SELECT查詢
- 28. Select查詢
- 29. SQL Select查詢
- 30. 如何在SQL Server 2005的值插入查詢中使用select查詢
你想做什麼?我無法想象用戶瀏覽這些結果。我無法想象一個批處理流程 – Rene
爲什麼您需要限制更新的結果集?在提交之前,我經常運行一次影響數百萬行的更新語句。 – Wolf
是不可能識別已經更新的行並忽略它們?也許存儲一個批號更新記錄 –