0

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

我尝试了几种方法:

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;

这两个结果都返回了几十万行,难以分析。

有没有人对如何处理/简化这个问题有什么建议?我可以在每次上传时唯一的几个列上进行自我加入吗?如果是,该自我加入会是什么样子?

感谢您的帮助。

4

2 回答 2

1

一种可能有用的方法是计算每条记录的哈希值并在此基础上运行匹配。它不必是某种超级安全的 SHA,只要是常规的 Oracle Ora_Hash(),只要您将获得非常小的哈希冲突机会。Ora_Hash 的 max_bucket_size 应该足够了 4,294,967,295。

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

或者,您可以将两个数据集整体连接起来,只要您使用 equi-joins 并且仅从数据集中投影标识的 rowid,它在性能方面将大致等效,因为哈希将在连接列上计算但也只需要存储rowid,保持哈希表的大小很小。棘手的部分是处理连接中的空值。

于 2013-06-01T07:20:28.117 回答
0

在进行这样的连接时,请确保不包含包含上传 ID 的列,以及添加到上传数据的任何审计数据。将联接限制为包含已上传数据的列。否则,MINUS 方法应该可以很好地工作。

于 2013-05-30T23:10:36.760 回答