这是我第一次提出问题,以便在今天之前的线程能够解决我的查询之前解决我的查询。
情境: 我在数据库中有两个表(比如A& B),它们有一些相同的行和一些不同的行。值得注意的是,两个表都有数百万行或至少超过一百万行。
现在我必须对它们执行set操作,就像没有。相同的行(交集),没有。新行(A-B)和没有。旧行(B-A)。
我有两个选择: 1)我可以在数据库中执行set-their查询设置操作。
2)或者我可以在内存中获取记录并对java.util.ArrayLIst执行操作。
但是在这两种情况下,它需要花费5到10分钟的时间,这可能是最好的( OPTIMIZED )方法。
请帮忙。
答案 0 :(得分:1)
首先,union
,minus
等不是对表的操作,而是对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