昨天报了如下错误:
无法为数据库“Z”中的对象“dbo.X”.“Y”分配空间,因为“PRIMARY”文件组已满
工程师从表中删除了一些记录后,错误被清除。我昨天无法检查详细信息,因为我实际上没有管理员访问权限。我的访问权限稍后进行了排序。当我今天检查数据库大小时,我观察到以下内容:
有 312.63 MB 可用空间,这意味着有 312.63 MB 空间分配给数据库但尚未分配给任何页面或对象(如果我错了,请纠正我)。我预计昨天的删除操作不会释放任何页面/空间。那么为什么数据库不能使用这个随时可用并分配给数据库的空间呢?
我忽略了文件自昨天以来进一步增长的可能性,因为事件发生时已经有足够的磁盘空间可用。这是一个 SQL Server 2016 SP1 Express Edition,它启用了Autogrowth设置,文件增长大小为 64 MB,最大大小设置为Unlimited。考虑:
10184 MB + 64 MB = 10248 MB > 10240 MB (= 10 GB = maximum allowed DB size in Express Edition)
很明显,该文件不能(也不能)进一步增长。
虽然数据库无法调整文件大小,但它仍然可以使用任何可用的空间。那为什么没有发生呢?
莫非,昨天删除后,有些对象被删除了?
您提到您不希望删除操作释放空间,但事实并非如此。由于删除而被清空的页面成为未使用空间(可以为同一对象重用),而清空的扩展区成为未分配空间(可以用于任何对象)。
因此,
DELETE
看起来已经在数据文件中释放了足够的空间以避免空间问题。考虑重新组织索引以进一步从部分填充的页面中回收空间,因为您的数据库仍然超过 95% 已满。