我需要從包含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查詢使用ORDER BY,OFFSET和PostgreSQL
- 2. 在SELECT查詢中使用*
- 3. 在mysql查詢的SELECT中使用SELECT
- 4. Sqlite LIMIT/OFFSET查詢
- 5. d3 select offset parent
- 6. 不能在LINQ查詢中使用select
- 7. SQL查詢在Select中使用CASE
- 8. PostgreSQL;在INSERT中使用SELECT子查詢
- 9. 如何在Python中使用select查詢?
- 10. MySQL查詢 - 在更新中使用SELECT
- 11. 在UPDATE查詢中使用select sub
- 12. 在SQL查詢中使用JQuery變量作爲OFFSET
- 13. Django反向查詢OFFSET 1
- 14. 使用SELECT查詢的INSERT查詢?
- 15. 在更新查詢中使用select select子查詢返回的結果
- 16. 如何在其他查詢中使用select子查詢MySQL
- 17. 我可以在INSERT查詢中使用SELECT子查詢嗎?
- 18. 使用SELECT MySQL查詢
- 19. 在SELECT查詢
- 20. 在SELECT查詢
- 21. 對另一個SELECT查詢使用knex SELECT查詢結果
- 22. 如何在mysql查詢中使用select另選select(Sub-Query)?
- 23. 使用同一表中的select查詢-2更新select select-1
- 24. 「SELECT ... IN(SELECT ...)」 查詢CI中
- 25. 現有查詢中使用select語句
- 26. 使用IF在MySQL的SELECT子查詢
- 27. SQL SELECT查詢從SELECT查詢
- 28. 在PostgreSQL中的SELECT查詢
- 29. 在SQLAlchemy中對所有查詢應用LIMIT和OFFSET
- 30. 總用select查詢
你想做什麼?我無法想象用戶瀏覽這些結果。我無法想象一個批處理流程 – Rene
爲什麼您需要限制更新的結果集?在提交之前,我經常運行一次影響數百萬行的更新語句。 – Wolf
是不可能識別已經更新的行並忽略它們?也許存儲一個批號更新記錄 –