【问题标题】:SELECT query with OFFSET in ORACLEORACLE 中带有 OFFSET 的 SELECT 查询
【发布时间】:2011-11-12 18:04:12
【问题描述】:

我需要从包含 1kkk 行的表的 java 代码中执行 SELECT 查询,因此结果集将接近 1kk 行。这就是为什么我需要限制它,并多次运行选择查询,每次只检索 10k 行。在获得 10k 行后,我对其进行更新,以便在下一次 SELECT 中不会检索到它们。 问题是 - 在从表中的第一行查看的每个选择 oracle 中,它会降低性能。 如何使用 OFFSET 避免 oracle 从第一行查找并传递已更新的行?

【问题讨论】:

  • 你想做什么?我无法想象用户浏览这么多结果。我无法想象分批工作的过程
  • 为什么需要限制更新的结果集?在提交之前,我会定期运行一次影响数百万行的更新语句。
  • 是否无法识别已经更新的行并忽略它们?可能会根据更新的记录存储批号
  • 我正在尝试根据一些逻辑更新数据库。我需要限制,因为我无法创建包含超过 100 万行的结果集对象。该程序将落在 HeapSpace 大小过载。
  • 如果您有 Oracle 12cR1 或更高版本,您可以使用 OFFSETstackoverflow.com/a/26051830/1461424

标签: sql oracle offset


【解决方案1】:

这些解决方案都没有真正提高性能。

您有一个包含 250,000 行的数据集,并以 10,000 个为一组获取它们。 除非您与数据库有状态连接并保持该 SELECT 语句正在进行(在 oracle 术语中这是“保持游标打开”),否则每个选择都独立于最后一个。

因此,要从 180,001 到 190,000 获取批次,它仍然需要进行排序,以便计算出前 190,000 行。诸如 OFFSET 之类的语法糖不会改变数学和逻辑的基本规则。

要获得最佳性能,您需要保持结果集打开并继续从中获取行。不要关闭它,也不要重新发出选择。

【讨论】:

  • 嗨,加里。我什至无法在 java 代码中创建结果集,因为它将包含 1+ 百万行,所以我需要通过多次使用 SELECT 查询来批量获取 10.000 行。并且最后一次 SELECT 将从第一行越过表格。
  • Connection.setFetchSize 允许您告诉 JBDC 驱动程序您希望它一次获取多少行。尝试将所有内容提取到 RowSet 中肯定会导致问题,但是 Oracle 的 JDBC 驱动程序足够智能,不会提取它不需要的行,而且我通过一次调用 Statement 来迭代 4000 万行查询结果没有问题。 query() 和对 ResultSet.next() 的 4000 万次调用
猜你喜欢
  • 2021-03-14
  • 2016-03-11
  • 2017-04-01
  • 2019-07-07
  • 2013-03-19
  • 2012-05-03
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多