2011-05-18 69 views
6

我已經繼承了一個表(300GB)充滿SQL數據類型Image的數據庫。我知道這個數據類型是折舊的。查找二進制重複記錄SQL Server 2008(數據類型圖像)

作爲例行清理,我想從符合某些條件的表中刪除所有重複的Image's。

如何有效比較使用SQL的二進制數據? =相等運算符是否足夠?

這裏有一個場景:

Table 'Paperwork' 
    int ID 
    int EmployeeID 
    int AnotherID 
    int AnotherFKID 
    image Attachment 

我想找到其中AttachmentEmployeeIDAnotherIDAnotherFKID是相同的所有行。它需要在對數據庫影響最小的情況下完成,因爲有1,116,313行。

編輯

在SQL Server Image數據類型不支持LIKE或普通的比較操作符。

編輯

感謝@馬丁誰建議Image被強制轉換爲VARBINARY。我已經加入到這個使用HASHBYTES

HASHBYTES('MD5',CAST(cast([Attachment] as varbinary(max))as varbinary)) AS AttachmentMD5

+0

「EmployeeID」,「AnotherID」,「AnotherFKID」組合的平均數量是多少?即平均需要比較多少圖像? – 2011-05-18 22:33:42

+0

這個月,3384.它是一個非常混亂的任務。數據可追溯到10年,可能是50%的重複數據。一個不好的數據輸入工具是怪罪。目前這些數據佔用了300GB的空間。 – Jeremy 2011-05-18 22:59:31

+4

3384在每個「EmployeeID」,「AnotherID」,「AnotherFKID」組內嗎?在這種情況下,你可能會更好[計算校驗和](http://stackoverflow.com/questions/1240425/what-are-the-differences-between-checksum-and-binary-checksum-and-when-what- a)每次預先減少實際比較次數。您需要將'image'強制轉換爲'varbinary(max)'來檢查具有相同校驗和的相同性。 – 2011-05-18 23:02:59

回答

3

傑里米,

所有都在同一個腳本,當它在300克讀取將殺死緩衝區高速緩存得到的MD5校驗。把工作分解成幾個任務。

任務1

  • 創建具有ID和分組表,顯示3組int的列的重複

表例如

TableID PaperWorkID GroupID 
     1  14   1 
     2  15   1 
     3  21   2 
     4  55   2 

現在我們知道PaperWorkID第14和15共享三個int列,因爲它們在同一個組中。

任務2

  • 添加一列(bigint)表並且基於該表中的PaperWorkID
  • 移除基於所有非重複表Paperwork填充圖像列的DATALENGTH列在數據長度和GroupID

任務3

  • 將一列varbinary(max)添加到表中。
  • 填充基於在表中的PaperWorkID圖像列的MD5散列列
  • 取下基於MD5哈希表中所有非重複和GroupID

任務4

  • PaperWork表進行2次備份
  • 根據剩餘表中的項目刪除Paperwork中的重複記錄。

如果從紙上掃描圖像列的數據,則兩次掃描產生完全相同的圖像的可能性很小。如果數據上傳了兩次,那麼你很幸運。