SQL Server Express 数据库达到了 10GB 的限制。我清除了一定年龄的很多订单。此清除空间是否可用于同一数据库中的其他表?我不需要减少数据库文件本身,我不介意分配 10GB,因为我宁愿没有空间用于其他文件而不是数据库空间不足。
我是否需要释放表中的空白空间以用于其他表?
SQL Server 将数据存储在 8kb 页面上,然后将这些数据排列成表示您的表的数据结构。在这种情况下,我发现将它们视为笔记本中的文字页面会很有帮助。笔记本是您的数据库数据文件,它有一堆页面。在笔记本内部,它会为表和索引分配某些页面,但也有一堆可用空间。
您可以运行查询以查看数据库中有多少可用空间。我有一个带有存储过程的开源DBA 数据库,您可以将其用于Check_FileSize,它将显示已用空间和可用空间。
您还可以使用内置存储过程在表级别查看总分配空间与已使用空间EXEC sp_spaceused 'dbo.MyTableName'。
行数据本身存储为堆或聚集索引顺序。如果它是一个堆,它会以任何随机顺序写入笔记本,只要有可用空间。如果表有聚集索引,则行数据按聚集键的顺序在逻辑上维护。既然您提到您删除了订单,我猜您可能在OrderID或 之类的东西上有一个聚集索引OrderDate,其中任何一个都大致按时间顺序放置数据。
您可能还有重要数据的非聚集索引,例如AccountID和OrderStatus。这些也按索引键顺序存储,每个索引都位于同一笔记本中自己的一组页面上。
现在,你提到你删除了数据......你没有提到多少,但为了我的例子,假设你删除了 1/3 的订单。
如果你删除了一堆最旧的数据,那就像在索引的开头擦除一堆连续的页面,并从这些页面中擦除每一行。这似乎不错。在笔记本类比中,有一堆连续的页面是空的,您有 1/3 的页面可供重复使用。对?
在 index by 上AccountID,有一堆索引指针指向您从页面中间删除的已删除订单。这些页面现在平均有 1/3 是空的。
在索引 by 上OrderStatus,您还删除了一堆对已删除行的引用。但是因为它们都是旧的、已完成的订单,所以它们不一定是整齐的连续清理,它会在状态为“竞争”的订单中随机进行。此索引可能包含完全空白和部分空白的页面组合。不过,空页可能位于索引的“中间”。中间的空页不能立即重用,因为它们卡在用过的页面中间。
这取决于。如果您在分配给表/索引的页面上有可用空间并且可用空间在正确的位置,SQL Server 可以根据需要将数据添加回该页面。
但是,如果您真的想回收尽可能多的空间,则需要重建表上的索引。如今,您不需要频繁(甚至定期)进行索引重建。但是在您的情况下,您希望从重要的删除操作中回收空间,因此将其作为一次性操作进行操作是有意义的。
ALTER INDEX... REBUILD 是 Express Edition 中的离线操作,因此请记住,它会在重建期间锁定您的表。
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |