我有一个包含1000万条记录而没有索引的表格,我正在尝试重复删除表格。我尝试使用select的插入,其中使用左连接或不存在;但每次我收到违反密钥的错误。另一个问题是日志文件变得太大而事务将无法完成。我尝试将恢复设置为简单,如在线推荐,但这没有帮助。以下是我使用的查询;
insert into temp(profile,feed,photo,dateadded)
select distinct profile,feed,photo,dateadded from original as s
where not exists(select 1 from temp as t where t.profile=s.profile)
这只会导致违反键错误。我尝试使用以下内容:
insert into temp(profile,feed,photo,dateadded)
select distinct profile,feed,photo,dateadded from original as s
left outer join temp t on t.profile=s.profile where t.profile is null
在这两个实例中,现在日志文件在事务完成之前填满。所以我的主要问题是关于日志文件,我可以找出使用查询进行重复数据删除。
答案 0 :(得分:2)
您可能需要分批工作。写一个循环来经历5000(你可以试验这个数字,我不得不在500或者多达50,000,这取决于数据库和它有多繁忙)记录一次。
你的钥匙是什么?可能你的查询需要在dataadded上使用aggreagate函数进行选择(使用min或max函数)。
答案 1 :(得分:1)
事务越大,事务日志就越大。
该日志用于未提交的开放事务恢复,因此如果您不经常提交并执行非常大的事务,则会导致日志文件大幅增长。提交后,文件将成为可用空间。这是为了在出现故障并需要回滚时安全保护数据。
我的建议是分批运行插入,在每批后提交