2011-09-08 222 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() –