【问题标题】:Performing "Optimized" set Operations on java.util.ArrayList or in SQL在 java.util.ArrayList 或 SQL 中执行“优化”集合操作
【发布时间】:2011-07-11 04:53:55
【问题描述】:

这是我第一次需要在今天之前的线程能够解决我的查询之前提出问题来解决我的查询。

场景: 我在数据库中有两个表(比如说 A 和 B),它们有一些相同的行和一些不同的行。需要注意的是,这两个表都有数百万行或至少超过一百万行。

现在我必须对它们执行设置操作,就像不一样。相同的行(交叉点),没有。新行(A-B)和没有。旧行数 (B-A)。

我有两个选择: 1)我可以在数据库上执行集合操作作为查询本身。

2) 或者我可以获取记录并对内存中的 java.util.ArrayLIst 执行操作。

但在这两种情况下,它花费了大约 5 到 10 分钟的时间,这可能是最好的(OPTIMIZED)方法。

请帮忙。

【问题讨论】:

  • 表中的记录是否被修改?
  • 您能告诉我们您使用的查询吗?

标签: java sql query-optimization set set-operations


【解决方案1】:

首先,unionminus等不是对表的操作,而是对select语句结果的操作。在您的情况下,您正在扫描巨大的表格,创建巨大的结果集,然后比较每个结果。这是非常缓慢的。您必须以可以使用索引的方式进行优化。

其次,将结果从 DB 加载到 Java,然后处理它们本质上比在 DB 中处理要慢,然后在 Java 中得到准备好的结果。

【讨论】:

  • 感谢您对 DB 方法的肯定答复。任何关于使用索引提高查询效率的教程。
  • @Vijay,为您的查询用于匹配的列创建索引。例如那些相同的。如果 Java 中有数据在内存中,查询会快得多,但是将数据放入内存的成本可能比仅在数据库中执行所有操作要大得多。顺便说一句 +1。
【解决方案2】:

选择数据库方法,因为数百人年用于优化 RDBMS 的查询逻辑。我确信您不想在您的客户中复制这项工作。如果当前使用 SQL 速度太慢,请确保所有必需的索引都已到位并执行查询执行计划分析(如何做到这一点因不同的数据库管理系统而异)以查找查询中的任何瓶颈(例如全表扫描)。

【讨论】:

  • 感谢您对 DB 方法的肯定答复。任何关于使用索引提高查询效率的教程。
【解决方案3】:

我会把它留给数据库。

如果表还没有主键,您可以在两个表中创建一个列(索引)来存储列值的哈希,使用该列进行更容易的比较,例如:

SELECT COUNT(*)
FROM a JOIN b ON a.hash = b.hash
    AND a.ColA = b.ColA
    AND a.ColB = b.ColB

【讨论】:

  • 感谢您对 DB 方法的肯定答复。任何关于使用索引提高查询效率的教程。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多