2012-03-28 64 views
0

我有一个1000万记录没有索引的表,我试图重复表格。我尝试插入选择使用左连接或不存在;但每次我都会收到违反密钥的错误。另一个问题是日志文件变得太大,事务将无法完成。我尝试将恢复设置为简单,因为建议在线,但这并没有帮助。以下是我使用的查询;SQL日志文件越来越大

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 

在这两种情况下,现在的日志文件中的交易完成之前填满。所以我的主要问题是关于日志文件,我可以找出与查询的重复。

回答

2

您可能需要分批工作。编写一个循环遍历5000次(你可以试验一下这个数字,我必须按照500或最多50,000次的数量进行试验,具体取决于数据库以及它的繁忙程度)记录在一次。

你的钥匙是什么?可能您的查询需要选择使用数据添加的聚合函数(使用min或max函数)。

+0

我会尝试这个 – vbNewbie 2012-03-28 15:22:45

+0

有人告诉我,无论使用批处理的,我需要对源表这是我做的一个非聚集索引没有,因为它确实包含模糊。或者如何做到这一点呢? – vbNewbie 2012-03-28 15:52:22

+0

索引不一定要是唯一索引 – HLGEM 2012-03-28 17:23:20

1

事务越大,事务日志将越大。

该日志用于未提交的开放式事务恢复,因此如果您不是经常提交并且执行一个非常大的事务,它会导致日志文件大幅增长。一旦提交,文件将成为可用空间。这是为了安全地保护数据,以防万一发生故障并需要回滚。

我的建议是运行分批插入,每个批次后提交

+0

感谢您的回复。你有什么想法,为什么我仍然得到违反唯一的关键错误 – vbNewbie 2012-03-28 21:05:08

+0

看到这里:http://stackoverflow.com/questions/6483699/unique-key-violation-in-sql-server -is-IT安全对承担错误-2627 – 2015-11-17 05:42:50