【问题标题】:sql log file growing too bigsql日志文件增长太大
【发布时间】:2012-04-12 03:44:21
【问题描述】:

我有一个包含 1000 万条记录且没有索引的表,我正在尝试对表进行重复数据删除。我尝试使用 select where 使用左连接或 where 不存在的插入;但每次我收到违反密钥的错误。另一个问题是日志文件变得太大,事务将无法完成。我尝试按照在线建议将恢复设置为简单,但这无济于事。以下是我使用的查询;

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

在这两种情况下,现在日志文件在事务完成之前就已填满。所以我的主要问题是关于日志文件,我可以通过查询找出重复数据删除。

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:

    您可能需要分批工作。编写一个循环来遍历 5000 个(您可以尝试使用这个数字,根据数据库和它的繁忙程度,我不得不下降到 500 或最多 50,000 个)记录左右。

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

    【讨论】:

    • 有人告诉我,无论使用批处理,我都需要在源表上有一个非聚集索引,因为它确实包含欺骗性,所以我没有。或者如何做到这一点?
    • 谢谢;我尝试了批处理的想法,并在目标表上违反了唯一键约束。我如何通过这个?感谢您的帮助。
    • 请描述目标表中的关键字段
    • 目标表:IX_Temp - profileUrl(ASC)--> 唯一键(非聚集) 源表:IX_PURL - profileUrl(ASC) ---> 索引(非聚集,非唯一
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多