我继承了一个数据库,其中包含一个充满SQL数据类型Image
的表(300gb)。我理解这个数据类型是折旧的。
作为例行清理,我想从符合某些条件的表中删除所有重复的Image
。
如何有效地使用SQL比较二进制数据? =等于运算符是否足够?
以下是一个场景:
Table 'Paperwork'
int ID
int EmployeeID
int AnotherID
int AnotherFKID
image Attachment
我想找到Attachment
,EmployeeID
,AnotherID
和AnotherFKID
相同的所有行。它需要在对数据库影响最小的情况下完成,因为有超过1,116,313行。
修改
SQL Server Image
数据类型不支持LIKE
或通常的比较运算符。
修改
感谢@Martin,他建议将Image
转换为varbinary。我已添加到此以使用Hashbytes获取MD5校验和
HASHBYTES('MD5',CAST(cast([Attachment] as varbinary(max))as varbinary)) AS AttachmentMD5
答案 0 :(得分:3)
杰里米,
任何一个脚本中的所有内容都会在读入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
),并根据表格中的DATALENGTH
使用表格Paperwork
中的图片列的PaperWorkID
填充该列< / LI>
GroupID
任务3
varbinary(max)
列。PaperWorkID
使用图片列的MD5哈希填充列GroupID
任务4
PaperWork
表Paperwork
中的重复记录。如果从纸张扫描图像列的数据,则两次扫描几乎不可能产生完全相同的图像。如果数据上传了两次,那么你很幸运。