2013-05-30 20 views
0

我在Oracle數據庫中有一個表,用於存儲用戶上傳的事務批處理。新的上傳機制已經實施,我想比較其結果。使用原有機制,然後使用新機制上傳單個批次。我試圖找到唯一的行(第一個上載中存在的I行不存在或第二個上載不同,或者第一個上載中不存在但第二個存在或不同的行)。我正在處理一個龐大的數據集(超過一百萬條記錄),這使得這種分析非常困難。包含在一個表中的重複數據中的唯一行

我嘗試了好幾種方法:

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; 

這兩種結果返回幾十萬行,因此很難分析。

有沒有人如何處理/簡化這個問題的任何建議?我可以在每個上傳的獨特列上進行自我加入嗎?如果是,那麼這個自我加入會是什麼樣子?

謝謝你的幫助。

+0

你能提供你的表格結構和可能的一些樣本數據與預期的結果嗎? – sgeddes

+0

Oracle版本?每次上傳是否存在唯一的密鑰,您可以使用這些密鑰來關聯負載之間的記錄? –

+0

@DavidAldridge Oracle v9.1有幾個(大約7個)字段可用作複合唯一鍵(這意味着它們在99%的時間內每次上傳都是唯一的。 – Zzz

回答

1

可能有用的一種方法是計算每條記錄的散列並基於該散列運行匹配。它不一定要是一些超級安全的SHA,只要是常規的Oracle Ora_Hash(),只要你碰到散列衝突的機會很小。 Ora_Hash應該是足夠的,max_bucket_size爲4,294,967,295。

我只是在兩組哈希之間運行連接。散列連接(如連接機制)非常有效。

另外,您可以爲您在使用同等聯接,只突出了識別的rowid的從數據集這將是大致相同的性能,明智的,因爲哈希值會被計算加入他們的條款內容的兩組數據,並且只要在連接列上,但只有rowid也必須存儲,以保持散列表的大小。這個棘手的部分在於處理連接中的空值。

0

當進行這樣的連接時,請確保不要包含包含upload-id的列以及添加到上傳數據的任何審計數據。限制連接到包含上傳數據的列。否則,MINUS方法應該運作良好。

相關問題