我需要从包含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
是不可能识别已经更新的行并忽略它们?也许存储一个批号更新记录 –