首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重复运行SQL Delete语句和收缩事务日志?

如何重复运行SQL Delete语句和收缩事务日志?
EN

Stack Overflow用户
提问于 2017-12-29 23:45:30
回答 2查看 137关注 0票数 0

我有一位客户的硬盘空间即将耗尽,空间完全被SQL DB和事务日志占用。不幸的是,移动数据库和日志目前对我们来说不是一个可用的选项,所以我需要弄清楚如何从两个大型表中删除行。到目前为止,一位同事已经花了4天的时间来尝试这样做,但还是没能起到作用。只有13 out可用于事务日志,并且从这些表中删除大量数据会很快将13 out的空间清除。显然,最快的做法是将我们想要保留的内容移动到一个临时表中,截断现有的表,然后再将它们移回。不幸的是,这是医院内极其繁忙的环境,并且每小时都有数万行被写入这些表。所以,不幸的是,我们不能为了能够截断而暂时停止对这个表的写入。

因此,我们一直在从每个表中一次删除一个月的数据,然后缩小事务日志以再次执行此操作。我觉得一定有办法让这一切重演,但我不完全确定我在做什么……我试过了:

代码语言:javascript
复制
delete top (10000)
from Table 1_
where CreationDate_ < '2017-06-01' 

Go

delete top (10000)
from Table2_
where CreationDate_ < '2017-06-01' 

Go

dbcc shrinkfile (SQL_Log,4)

Go 2

Go 2

这似乎从每个表中删除了10,000行,然后运行两次日志的收缩文件(由于某种原因,当我们只运行两次时,它不会完全缩小到4224kb的大小),但它似乎不会重复。我还尝试添加(),从第一个delete语句开始,到第一个"Go 2“行结束。当我这样做的时候,它只会说:

代码语言:javascript
复制
Incorrect syntax near "Go"

有谁知道怎么做吗?如果我们可以让它工作,我计划将delete语句增加到远大于10,000的数字,并将脚本上的repeat增加到远大于2的值,但我需要在真正做到这一点之前让它工作……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-30 00:53:33

您可以使用WHILE循环,并使用记录的COUNT控制迭代次数。

代码语言:javascript
复制
DECLARE @Chunk INT = 10000
DECLARE @Date DATE = '2017-06-01'
DECLARE @Cnt INT = SELECT COUNT(*) FROM Table 1_ WHERE CreationDate_ < @Date
WHILE @Cnt > 0
  BEGIN
    delete top (@Chunk)
    from Table 1_
    where CreationDate_ < @Date
    SET @Cnt = @Cnt - @Chunk
  END
//Move on to the next group
SET @Date = '2017-07-01'
SET @Cnt = SELECT COUNT(*) FROM Table 1_ WHERE CreationDate_ < @Date

WHILE @Cnt > 0
   BEGIN
   // Your delete query
   SET @Cnt = @Cnt - @Chunk
END
//and so on
票数 1
EN

Stack Overflow用户

发布于 2017-12-29 23:49:55

您不需要重复收缩日志文件。如果数据库处于简单恢复模式,只要不在单个事务中删除太多行,日志文件就不会继续增长。清除所有行之后,您可以将日志文件缩小为适合环境的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48024989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档