在java.util.ArrayList或SQL中执行“优化”集操作

时间:2011-07-11 04:53:55

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

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

情境: 我在数据库中有两个表(比如A& B),它们有一些相同的行和一些不同的行。值得注意的是,两个表都有数百万行或至少超过一百万行。

现在我必须对它们执行set操作,就像没有。相同的行(交集),没有。新行(A-B)和没有。旧行(B-A)。

我有两个选择: 1)我可以在数据库中执行set-their查询设置操作。

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

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

请帮忙。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

采用数据库方法,因为数百人每年都在优化RDBMS的查询逻辑。我相信你不想在你的客户端复制这项工作。如果使用SQL当前速度太慢,请确保所有必需的索引都已到位并执行查询执行计划的分析(如何在不同的数据库管理系统之间执行此操作)以查找查询中的任何瓶颈(例如完整表)扫描)。

答案 2 :(得分:0)

我会把它留给数据库。

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

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