【问题标题】:SQL 2008 blob data unused space cannot be freedSQL 2008 blob 数据未使用空间无法释放
【发布时间】:2012-12-26 08:55:24
【问题描述】:

环境:SQL Server 2008 spk1 企业版。

我有一个存储varbinary 和blob 数据的大表。如果我在 SSMS 中运行磁盘使用报告,我们会看到数据库中大约三分之一的空间(此应用程序有数百个)显示为“未使用空间”(我不是指未分配。)

我在互联网上遇到了许多人的解决方案,但这些解决方案不起作用。

  • dbcc cleantable
  • 删除聚集索引并重建它
  • 重建所有索引

如果我select * into 另一个表,它会重建该表而没有所有额外的麻烦。

如果我跑:

SELECT alloc_unit_type_desc, avg_page_space_used_in_percent, record_count,
ghost_record_count FROM sys.dm_db_index_physical_stats
(DB_ID(N'Test_dbname'), OBJECT_ID(N'table_name'), NULL, NULL , 'DETAILED');

我收到:

alloc_unit_type_desc avg_page_space_used_in_percent record_count ghost_record_count
IN_ROW_DATA          66.7239065974796               12404285     0
IN_ROW_DATA          0.850741289844334              333460       0
IN_ROW_DATA          44.903076352854                80002        0
IN_ROW_DATA          78.5273041759328               374          0
LOB_DATA             64.0441438102298               62248788     0

我认为这表明分配了大量空间。问题是为什么我不能减少这个空间?在数百个数据库的过程中,我们谈论的是 TB 级的浪费空间。

【问题讨论】:

  • 你能从 dm_db_index_physical_stats 中选择与空间相关的列并显示它们吗?我想查看以页而不是行为单位测量的数字。另外,请运行DETAILED 扫描并发布碎片编号(碎片,avg_fragment_size)。
  • 这对于数据库管理员论坛来说可能是一个更好的问题。 dba.stackexchange.com

标签: sql sql-server blob space


【解决方案1】:

把它想象成一个文件系统。选择到另一个表中,希望将使用的数据写入 mdb 中的连续块中。然后你在这里和那里更改一些 blob,DBMS 非常明智地希望保持每个 blob 连续....

所以即使有一个命令来整理表格,它基本上也会做你现在正在做的事情,其他任何事情都会要求它。

真正的答案是不要使用 RDBMS 来存储此类数据。

【讨论】:

  • Tony 你是说答案是没有办法清理这张表吗?
  • 不,我是说使用它会使它再次变得混乱。更不用说清理它意味着没有任何工作空间的机会,所以无论如何它都会扩大。就像用 100% 填充因子重建索引一样。 RDBMS 和 blob 是一个非常令人不安的组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2010-12-29
  • 1970-01-01
  • 2018-01-28
相关资源
最近更新 更多