0

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

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

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

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

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

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

请帮忙。

4

3 回答 3

1

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

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

于 2011-07-11T05:04:45.760 回答
0

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

于 2011-07-11T04:59:42.510 回答
0

我会把它留给数据库。

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

SELECT COUNT(*)
FROM a JOIN b ON a.hash = b.hash
    AND a.ColA = b.ColA
    AND a.ColB = b.ColB
于 2011-07-11T04:59:59.560 回答