我需要在包含1kkk行的表上的java代码中执行SELECT查询,因此结果集将接近1kk行。这就是为什么我需要限制它,并多次运行选择查询,每次只检索10k行。在我得到10k行后,我更新它,所以在下一个SELECT中它们将不被检索。 问题是 - 在每个选择oracle从表中的第一行看,因此它会降低性能。 如何使用OFFSET避免从第一行查找oracle并传递已更新的行?
答案 0 :(得分:8)
这些解决方案都没有真正提高性能。
您有一个250,000行的数据集,并以10,000个批量获取它们。 除非你有一个与数据库的有状态连接并保持SELECT语句正在进行(在oracle术语中这是'保持游标打开'),所以每个select都独立于最后一个。
因此,要将批次从180,001提取到190,000,它仍然需要排序,以便它可以计算出前190,000行。诸如OFFSET之类的句法糖不会改变数学和逻辑的基本规则。
为了获得最佳性能,您需要保持结果集处于打开状态,并始终从中获取行。不要关闭它,也不要重新发出选择。