0

我在维护一些古老的数据库时遇到了一些麻烦。它已经存在了很长时间(不,我没有设计它,不,不可能对其进行任何更改)

它是这样的:有 2 个表,“文档”和“版本”。Documents 是一个非常简单的表,只有一个主键,一个 varchar 存储文档名称和创建该文档的用户。Versions 具有它所属文档的外键,一个存储实际文档的图像字段(主要是单词文档和 pdf)、扩展名和另一个保存版本号的字段。

每当应用程序(ANCIENT VB6 应用程序)使用文档时,就会生成一个新版本。

每天晚上,在数据库上运行一个作业,以便删除每个文档的 5 个最新版本之外的所有版本。这一直在工作,永远。

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4

问题是,尽管每天版本表都运行此作业以丢弃最旧的条目,但数据库的大小已达到惊人的大小(目前为 300+ GB)。

为了减小上述大小,有人最终意识到没有必要对 pdf 元素进行版本控制。所以,我被命令应用一个简单的修改:

该作业将删除旧版本的 word 文档,保留最新的 5 个版本。对于任何其他类型的文件,除了最新版本之外的所有版本都将被删除。因此,我将作业关联的存储过程更改为:

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 
AND extension  LIKE 'do%';

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument) 
AND extension  NOT LIKE 'do%';

但是,应用更改后,第二天作业历史记录通知以下错误

“SQL Server 数据库引擎的实例此时无法获取LOCK资源。当活动用户较少时重新运行您的语句。请数据库管理员检查此实例的锁和内存配置,或检查是否长时间运行事务。[SQLSTATE HY000](错误 1204)。步骤失败。”

我现在有点迷路了,有什么想法吗?

4

1 回答 1

1

您可以尝试将行删除 100 或任何快速有效的数字。

declare @rows int
set @rows = 1
while @rows > 0
BEGIN
DELETE TOP (100)  FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 AND extension  LIKE 'do%';
set @rows = @@ROWCOUNT
END
于 2013-09-24T18:42:32.660 回答