我们将数据序列化为xml,将其放入文件中,然后从数据库中删除该数据。我们将此流程称为“存档”。 问题是我们必须在归档之前和归档之后记录数据库可用空间大小。我们使用存储过程确定可用空间
ALTER PROCEDURE [dbo].[SP_USED_SPACE]
AS
BEGIN
declare @reservedpages bigint, @dbsize bigint
select @reservedpages = sum(a.total_pages)
from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id
left join sys.internal_tables it on p.object_id = it.object_id
select @dbsize = sum(convert(bigint,case when status & 64 = 0 then size else 0 end)) from dbo.sysfiles
SELECT (convert (dec (15,2), @dbsize)) * 8192 / 1048576 as database_size,
(case when @dbsize >= @reservedpages then
(convert (dec (15,2),@dbsize) - convert (dec (15,2),@reservedpages))
* 8192 / 1048576 else 0 end) as free_space
END
但归档后,该过程返回的值几乎或与归档前的值完全相同。好吧,我可以保证删除的数据相当可观,比如几个表中的数百行。
Screenshot of what is returned before and after archiving
我已经尝试过了:
这种行为可能是什么原因以及如何解决?
答案 0 :(得分:2)
当表没有聚簇索引时,DELETE-Statement不会释放页面。所以空间不能被其他对象重用。
您可以使用选项取消分配页面:
在线查看MSDN,主题锁定行为 https://msdn.microsoft.com/en-US/library/ms189835(v=sql.120).aspx