SQL Server 2016:当数据库中仍有 313 MB 可用空间时,表无法增长

RGO*_*RGO 1 express-edition sql-server-2016

昨天报了以下错误:

无法为数据库 'Z' 中的对象 'dbo.X'.'Y' 分配空间,因为 'PRIMARY' 文件组已满

工程师从表中删除了一些记录后,错误被清除。我昨天无法检查详细信息,因为我实际上没有管理员访问权限。我的访问后来被排序。当我今天检查数据库大小时,我观察到以下情况:

在此处输入图片说明

有 312.63 MB 可用空间,这意味着有 312.63 MB 空间分配给数据库但尚未分配给任何页面或对象(如果我错了,请纠正我)。我不希望昨天的删除操作释放任何页面/空间。那么为什么数据库不能使用这个随时可用并分配给数据库的空间呢?

我忽略了文件自昨天以来进一步增长的可能性,因为在事件发生时已经有足够的磁盘空间可用。这是一个 SQL Server 2016 SP1 Express Edition,它已启用自动增长设置,文件增长大小为 64 MB,最大大小设置为Unlimited。考虑:

  10184 MB + 64 MB = 10248 MB > 10240 MB (= 10 GB = maximum allowed DB size in Express Edition)
Run Code Online (Sandbox Code Playgroud)

很明显,该文件不能(也不能)进一步增长。

虽然数据库无法调整文件大小,但它仍然可以使用任何可用空间。那为什么没有发生呢?

会不会是昨天delete后有对象被drop掉了?

Dan*_*man 5

您提到您不希望删除操作释放空间,但事实并非如此。由于删除而被清空的页面成为未使用的空间(可以为同一对象重用),而被清空的范围成为未分配的空间(可以用于任何对象)。

因此,DELETE看起来已经在数据文件中释放了足够的空间以避免空间问题。考虑重新组织索引以进一步从部分填充的页面中回收空间,因为您的数据库仍然超过 95% 已满。