Database 在两个oracle架构之间的表中查找重复记录

Database 在两个oracle架构之间的表中查找重复记录,database,oracle,performance,oracle11g,Database,Oracle,Performance,Oracle11g,我有两个数据库,包含数百万条记录(6000-1亿条记录)(假设学生记录) 第一个模式是暂存模式,第二个是目标产品模式 在复制prod模式之前,我想检查暂存模式中的同一用户是否已经存在(如果存在,则应用一些合并逻辑) 我有一些按顺序运行并匹配记录的PL/Sql代码,但是这个过程非常慢,即使在索引和性能调优时也是如此 是否可以使用pl/sql函数的匹配器或多线程?在甲骨文有没有更好的替代方案,我可能会错过 一种可能的解决方案是从prod模式复制一些数据(参与复制过程的数据),并在staging模式中

我有两个数据库,包含数百万条记录(6000-1亿条记录)(假设学生记录)
第一个模式是暂存模式,第二个是目标产品模式

在复制prod模式之前,我想检查暂存模式中的同一用户是否已经存在(如果存在,则应用一些合并逻辑)

我有一些按顺序运行并匹配记录的PL/Sql代码,但是这个过程非常慢,即使在索引和性能调优时也是如此

是否可以使用pl/sql函数的匹配器或多线程?在甲骨文有没有更好的替代方案,我可能会错过

一种可能的解决方案是从prod模式复制一些数据(参与复制过程的数据),并在staging模式中执行比较,但复制数据开销可能与比较相同

样本记录:

Student_first_name,Student_Last_name,SSN
foo,              ,bar               ,123456

首先-在模式之间复制数据不会提高性能,Oracle在模式内查询上的执行速度不会更快


第二,使用一个SQL来识别重复的记录(或丢失的记录,以表中较小的部分为准),然后单独对这些行执行pl/SQL代码可能会有很大帮助(通过将它们存储在游标中或使用专用列标记它们),尤其是如果与完整的prod表相比,每天添加的数据量可以忽略不计。

如果“按顺序运行的PL/SQL代码”意味着您有一个循环,在该循环中您正在逐行处理(也称为逐慢处理)对于数据,最好编写一个基于集合的
merge
语句。答案太长,所以给你提示。忘记merge吧,它比顺序插入/更新更慢。你需要:分区、批插入/更新和prolly临时表。另一方面,如果你的模式/数据允许,你可以Hash索引和/或Hash集群中提到的do值得一试。这种数据更新可能比BTree索引做得更好。例如,根据姓氏的第一个字母将表划分为26个分区。这减少了查找要更新的行所需的时间。这也有助于并行化进程,您可以可以同时运行26个更新作业,无争用。