一个表中包含的重复数据中的唯一行

时间:2013-05-30 22:54:55

标签: sql oracle join group-by

我在Oracle DB中有一个表,用于存储用户上传的事务批处理。已经实施了一个新的上传机制,我想比较一下它的结果。使用原始机制上载单个批次,然后使用新机制上载。我试图找到唯一的行(我在第一次上传中存在的行不存在或在第二次上载中不同。或者在第一次上载中不存在但在第二次上传时存在或不同的行)。我正在处理一个庞大的数据集(超过一百万条记录),这使得这种分析非常困难。

我尝试了几种方法:

SELECT col1, col2 ...
FROM table
WHERE upload_id IN (first_upload_ID, second_upload_id)
GROUP BY col1, col2..
HAVING COUNT(*) = 1;

SELECT col1, col2 ...
FROM table
WHERE upload_id = first_upload_ID
MINUS
SELECT col1, col2 ...
FROM table
WHERE upload_id = second_upload_id;

SELECT col1, col2 ...
FROM table
WHERE upload_id = second_upload_id
MINUS
SELECT col1, col2 ...
FROM table
WHERE upload_id = first_upload_ID;

这两个结果都返回了数十万行,这使得分析变得困难。

有人对如何处理/简化此问题有何建议?我可以在几个每个上传独有的列上进行自我加入吗?如果是,那自我加入会是什么样的?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

可能有用的一种方法是计算每条记录的哈希并根据该方法运行匹配。它不一定是一些超级安全的SHA,只要是普通的Oracle Ora_Hash(),只要你的哈希冲突几率很小。对于max_bucket_size为4,294,967,295,Ora_Hash应该足够了。

我只是在两组哈希之间运行连接。散列连接(如在连接机制中)非常有效。

或者你可以在它们的整体中加入这两个数据集,并且只要你使用等连接并且只从数据集中投射识别的rowid,它将在性能上大致相同,因为哈希值将在连接列,但只需要存储rowid,保持哈希表的大小。处理联接中的空值是一个棘手的部分。

答案 1 :(得分:0)

执行此类连接时,请确保不包含包含upload-id的列,以及添加到上载数据的任何审核数据。将连接限制为包含上载数据的列。 MINUS方法应该可以正常工作。