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

标签 sql sql-server sql-server-2008

我继承了一个数据库,其中有一个充满 SQL 数据类型 Image 的表 (300GB)。我了解此数据类型已贬值。

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

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

这是一个场景:

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

我想查找 AttachmentEmployeeIDAnotherIDAnotherFKID 相同的所有行。由于有超过 1,116,313 行,因此需要在对数据库影响最小的情况下完成。

编辑

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

编辑

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

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

最佳答案

杰里米,

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

任务1

  • 使用 ID 创建一个表格,并进行分组以显示三个 int 列的重复项

表格示例

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

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

任务2

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

任务3

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

任务4

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

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

关于sql - 查找二进制重复记录 SQL Server 2008(数据类型图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051761/

相关文章:

SQL 查询让 child 拥有相同数量的玩具

sql - 插入后为当前时间戳更新创建触发器

.net - LinqToSQL Select 和 SelectMany 与 Join

sql - T-SQL - 如何更快地使用多个 LIKE 子句进行 SELECT 查询?

sql - 如何查找超过1个大写字符

sql - 使用 sp_addmessage 写入具有不同事件 ID 的事件日志

sql-server-2008 - Business Intelligence Development Studio 2008 安装

mysql - SQL 连接表较低的日期和较低的 ID

sql - Scope_Identity()、Identity()、@@Identity 和 Ident_Current() 之间有什么区别?

sql - 如何在 SQL 全文 'contains' 函数中转义双引号?