我在维护一些古老的数据库时遇到了一些麻烦。它已经存在了很长时间(不,我没有设计它,不,不可能对其进行任何更改)
它是这样的:有 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)。步骤失败。”
我现在有点迷路了,有什么想法吗?