在Java中以最优化的方式比较2个Oracle表之间的数据

时间:2014-09-26 04:32:03

标签: java oracle performance

我在Oracle数据库中有2个表。 我想以最佳方式比较这些表格。 下面是我想要完成的一个例子。

表1

ID    FieldA   FieldB              
1      X         Y
2      C         D
3      E         F
4      G         H       
5      I         J

表2

ID    FieldA   FieldB 
10     Z          V
8      K          L
1      O          P
2      S          T

必须根据ID比较这两个表。 如果Table2中不存在ID,我想在Table2中插入该信息。 如果表2中存在ID,我想通过覆盖Table1中的信息来更新Table2中的信息。 此外,我需要识别Table2中存在的ID,但是从Table1中删除,并在表2中标记一列,以便它表示缺少条目。

两个表的结构相同(列数,列名,索引)。

我的想法是做以下事情:

  • 对于表2中的每条记录,在表1中找到它(这可以通过编写查询来完成) 如果表1中不存在具有此ID的记录,请使用标记标记此记录以指示其无效条目。 如果表1中存在具有此ID的记录,则使用表1中的条目覆盖表2中的条目。此外,在某些数据结构中维护此ID信息。 在遍历表2中的所有记录之后, 编写一个查询,从表1中获取记录,使得在上述数据结构中维护的ID不是表1的一部分。 现在将这些记录插入表2中。

最终结果应该是这样的:

表2

ID FieldA   FieldB
10   Z         V  ---> This row will be marked with a flag to indicate its an invalid entry
8    K         L  ---> This row will be marked with a flag to indicate its an invalid entry
1    X         Y
2    C         D
3    E         F
4    G         H
5    I         J    

两个表中都有数百万条记录。 有人能建议为大量数据实现这一结果的最佳方法吗? (任何示例代码片段都会有帮助。)我不确定多线程是否有用,因为我对线程知之甚少。

注意:每次插入/修改一个条目后,我都想调用一些API来记录一些消息。

2 个答案:

答案 0 :(得分:2)

不要考虑为此编写任何java。这样的事情应该在DB中完成。学习一些SQL。

  

如果Table2中不存在ID,我想在Table2中插入该信息。

我不知道确切的Oracle语法,但它遵循这一行

INSERT INTO Table2 (SELECT * FROM Table1 LEFT JOIN Table2 ON Id WHERE Table2.Id IS NULL)

全部,没有数据从数据库发送到应用程序。工作原理:

SELECT * FROM Table1 JOIN Table2 ON Id

会将Table1中的每一行与Table2中具有相同Id的行配对。

SELECT * FROM Table1 LEFT JOIN Table2 ON Id

另外返回Table1中没有表2中相应行的所有行。对于他们,Table2.Id为NULL。

SELECT * FROM Table1 LEFT JOIN Table2 ON Id WHERE Table2.Id IS NULL

过滤掉具有非空Table2.Id的行,即匹配的行。

插入插入......全部。数据库针对此类任务进行了优化,因此一百万行是花生。

答案 1 :(得分:0)

  

如果表1中存在具有此ID的记录,则使用表1中的条目覆盖表2中的条目。此外,在某些数据结构中维护此ID信息。

我会使用MERGE语句。它会处理INSERTUPDATE逻辑。您有两个表,需要检查table_1中的ID,因此USING子句将SELECT column_list... FROM TABLE_1

逻辑是:

WHEN MATCHED THEN INSERT....

WHEN NOT MATCHED THEN UPDATE TABLE_2...

所以,你所做的只是MERGE INTO TABLE_2

在此处阅读有关MERGE的文档http://docs.oracle.com/database/121/SQLRF/statements_9016.htm

您可以在http://www.oracle-base.com/articles/10g/merge-enhancements-10g.php

找到有关MERGE语句的更多示例