【问题标题】:How to process 250K records in ResultSet in multithreading or any other faster way?如何以多线程或任何其他更快的方式处理 ResultSet 中的 250K 记录?
【发布时间】:2016-06-01 18:01:26
【问题描述】:

目前我的 SQL 结果集带来了大约 25 万条记录,需要处理。完成该过程需要 25 秒。我打算对它进行多线程处理。但无法从 ResultSet 中拆分数据。谷歌搜索时它说 CachedRowSet,但没有适当的例子来实现它。请有人帮我解决这个问题。提前致谢。

【问题讨论】:

  • 您是否需要等待所有 250K 记录才能移动到应用程序的下一部分?如果没有,那么您可以在另一个线程中运行 ResultSet 代码并使用生产者/消费者模式。
  • @karthikeyan Govindaraj 尝试按集合获取数据。在 1000(分页)之后取数据 1000。然后它会很快并提供更好的性能..
  • @KarthikeyanSubramaniam 我做不到。因为我从表的连接中获取。所以如果我一个接一个地拿,可能有机会再次获得相同的记录吧?
  • 另外,您是否可以优化查询,使其不带回 250K 记录。我怀疑您是否向 UI 显示了所有 250K 记录。
  • 多线程无济于事。仍然只有一个网络,而且不是多线程的。您应该在发送之前尝试减小结果集的大小, 使用更具选择性的查询,或者通过更新在服务器上进行处理。

标签: java multithreading resultset cachedrowset


【解决方案1】:

您可以通过加入更多表来编写查询,也可以尝试使用它 两个关键词

FETCH and OFFSET.
For 1st Ex : fetch = 1, offset = 1000
For 2nd Ex : fetch = 1001, offset = 1000

请检查此链接 https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx

通过从数据库中获取集合之后的集合 您可以使用分页概念 在任何情况下都不会影响 UI。

在甲骨文的情况下: 您可以通过指定 OFFSET 在 12c 上轻松完成。

在 12c 中,

SELECT val FROM table ORDER BY val OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

要在 11g 及之前的版本上执行相同操作,您需要使用 ROWNUM 两次,分别使用内部查询和外部查询。

11g 中的相同查询,

SELECT val FROM (SELECT val, rownum AS rnum FROM (SELECT val FROM table ORDER BY val) WHERE rownum <= 8) WHERE rnum > 4;

这里的偏移量是 4。

【讨论】:

  • 你怎么知道 OP 正在使用 SQL Server?
  • 它是 Oracle 数据库。
  • 对于Oracle也类似请这个链接dba-oracle.com/t_offset_fet_first_rows_only.htm
  • 我的是 oracle 11g,所以我也不能使用它。我还需要加入大约 19 个表才能获得结果集。
  • 您可以在 12c 上通过指定 OFFSET 轻松完成。在 12c 中,SELECT val FROM table ORDER BY val OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;要在 11g 和之前的版本上做同样的事情,你需要使用 ROWNUM 两次,分别是内部查询和外部查询。 11g中同样的查询,SELECT val FROM (SELECT val, rownum AS rnum FROM (SELECT val FROM table ORDER BY val) WHERE rownum 4;这里的偏移量是 4。
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 2015-03-02
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多