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,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
杰里米,
任何多合一脚本在读取 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 列的填充该列PaperworkPaperWorkIDGroupID任务3
varbinary(max)向表中添加一列。PaperWorkID根据表中的image 列的 MD5 哈希值填充该列GroupID任务4
PaperWork备份Paperwork根据表中剩余的项目删除重复记录。如果图像列的数据是从纸张上扫描的,则两次扫描产生完全相同图像的可能性很小。如果数据上传了两次那么你很幸运。