【问题标题】:How to safely release unallocated space for 1 table in a database?如何安全地释放数据库中 1 个表的未分配空间?
【发布时间】:2015-09-01 05:50:33
【问题描述】:

我们的生产数据库位于 SQL Server 2008 R2 上。我们的表之一 Document_Details 存储用户通过我们的应用程序 (VB) 上传的文档。它们以 varbinary(max) 格式存储。有超过 20k 个 pdf 格式的文件,其中许多都很大(有些是 50mb)。所以总的来说这张表是90GB。然后,我们运行了一个 exe,将这些 pdf 文件压缩到 10GB。

但是问题就在这里 - 表的大小仍然是 90GB。未分配的空间尚未释放。如何取消分配此空间以使表为 10GB?

我尝试将表移动到新文件组,然后返回原始文件组,但无论哪种情况,它都没有释放任何空间。

我也尝试重建表上的索引,但也没有用。

有效的方法(但我听说不推荐)是 - 将恢复类型从简单更改,缩小文件组,将恢复设置为完整。

我能否将此表移动到一个新文件组并然后缩小该文件组(即仅 Document_Details 表)?我知道收缩命令会影响性能,但如果它只是 1 个表,它仍然是一个问题吗?或者还有什么我可以尝试的吗?

谢谢。

【问题讨论】:

  • 你运行了什么exe来压缩数据?
  • 你试过 DBCC SHRINKDATABASE
  • @Prime - 我们的开发人员创建了一个压缩 pdf 的命令行 .net exe。
  • @frlan - 我做到了,而且成功了,但我认为这会影响性能并且不推荐?
  • 偶尔收缩一个数据库不是问题。但它不是那么有用。就您而言,为什么要节省 80gb 空间?最终,您仍然需要 90gb 或更多的空间。

标签: sql sql-server shrink


【解决方案1】:

将表移动到文件组有一个问题:默认情况下,TEXTIMAGE 数据(blob)不会移动!表的行可以驻留在一个文件组和 blob 上,也可以驻留在另一个上。这是 SQL Server 中的一个疯狂缺陷。也许通过重建表,blob 根本就没有被触及。

也可以使用一种众所周知的方法来move lob data。这将重建 lobs 并缩小它们。

【讨论】:

  • 谢谢,我会测试一下。保存 pdf 的列是 varbinary,它的行为方式是否与 LOB 或 BLOB 数据相同或相似?
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多