Sql 在删除大量数据后测量数据库的可用空间

Sql 在删除大量数据后测量数据库的可用空间,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我们将数据序列化为xml,将其放入文件中,然后从数据库中删除该数据。我们称此过程为“归档”。 问题是我们必须在归档之前和之后记录数据库可用空间大小。我们使用存储过程确定可用空间 ALTER PROCEDURE [dbo].[SP_USED_SPACE] AS BEGIN declare @reservedpages bigint, @dbsize bigint select @reservedpages = sum(a.total_pages) from sys.partiti

我们将数据序列化为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
但在归档之后,该过程返回的值与归档之前几乎或完全相同。嗯,我可以保证删除的数据是相当可观的,比如说在几个表中有几百行

我已经试过:

  • DBCC更新
  • 发送普通查询,而不使用可缓存的存储过程
  • 在存档后调用过程之前,在C#中添加Thread.Sleep(5000)。(这在我的本地计算机上有效,但在服务器上无效。增加括号之间的值并不保证它在任何情况下都能在任何地方有效)
  • 删除数据后执行数据库收缩
  • 使用不同的方法确定可用空间大小,即使用FILEPROPERTY或sp_spaceused

  • 这种行为的原因可能是什么?如何修复它?

    当表没有聚集索引时,DELETE语句不会取消分配页面。因此,空间不能被其他对象重用

    您可以使用以下选项取消分配页面:

  • 在DELETE语句中使用TABLOCK提示
  • 如果可能,在表上创建聚集索引 在这里,您可以删除而不需要TABLOCK提示
  • 在线查看MSDN,主题锁定行为

    您正在存档的数据库表是从堆中还是具有聚集索引的表中?@CPMunich目前我不能确定,但我认为任何表中都没有聚集索引。我会尽快澄清。试着按照下面的查询进行检查:我们花了2个月的时间来解决这个问题!现在它工作了!每次删除操作后,我都会放置
    altertablerebuild
    。谢谢!不客气。很高兴知道,那张桌子。。。重建也很有效。