查找二进制重复记录SQL Server 2008(数据类型图像)

Jer*_*emy 6 sql sql-server sql-server-2008

我继承了一个数据库,其中包含一个充满SQL数据类型的表(300gb)Image.我理解这个数据类型是折旧的.

作为例行清理,我想Image从表中删除满足某些条件的所有副本.

如何有效地使用SQL比较二进制数据?=等于运算符是否足够?

这是一个场景:

Table 'Paperwork'
  int ID
  int EmployeeID
  int AnotherID
  int AnotherFKID
  image Attachment
Run Code Online (Sandbox Code Playgroud)

我想找到的所有行Attachment,EmployeeID,AnotherIDAnotherFKID是相同的.它需要在对数据库的影响最小的情况下完成,因为有超过1,116,313行.

编辑

SQL Server Image数据类型不支持LIKE或通常的比较运算符.

编辑

感谢@Martin建议将Image其转换为varbinary.我已添加到此以使用Hashbytes获取MD5校验和

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

RC_*_*and 3

杰里米,

任何多合一脚本在读取 300g 数据时都会杀死缓冲区高速缓存。将工作分解为几个任务。

任务1

  • 创建一个包含ID和分组的表以显示三个 int 列的重复项

表示例

    TableID  PaperWorkID GroupID
       1        14          1
       2        15          1
       3        21          2
       4        55          2
Run Code Online (Sandbox Code Playgroud)

现在我们知道PaperWorkIDs 14 和 15 共享相同的三个 int 列,因为它们位于同一组中。

任务2

  • bigint向表中添加一列 ( ),并根据表DATALENGTH中的 ,使用表中 Image 列的填充该列PaperworkPaperWorkID
  • 根据数据长度删除所有非重复项GroupID

任务3

  • varbinary(max)向表中添加一列。
  • PaperWorkID根据表中的image 列的 MD5 哈希值填充该列
  • 根据 MD5 哈希和值从表中删除所有非重复项GroupID

任务4

  • 对表进行 2 次PaperWork备份
  • Paperwork根据表中剩余的项目删除重复记录。

如果图像列的数据是从纸张上扫描的,则两次扫描产生完全相同图像的可能性很小。如果数据上传了两次那么你很幸运。