相关疑难解决方法(0)

尝试回收未使用的空间会导致 SQL Server 中的已用空间显着增加

我在生产数据库中有一个表,其大小为 525 GB,其中 383 GB 未使用:

未使用的空间

我想回收其中的一些空间,但是,在弄乱生产数据库之前,我正在测试数据库中数据较少的相同表上测试一些策略。这个表有一个类似的问题:

未使用的空间

关于表的一些信息:

  • 填充因子设置为 0
  • 大约有 30 列
  • 其中一列是图像类型的 LOB,它存储的文件大小从几 KB 到几百 MB
  • 该表没有任何与之关联的假设索引

服务器正在运行 SQL Server 2017 (RTM-GDR) (KB4505224) - 14.0.2027.2 (X64)。数据库正在使用SIMPLE恢复模型。

我尝试过的一些事情:

  • 重建索引:ALTER INDEX ALL ON dbo.MyTable REBUILD. 这产生了微不足道的影响。
  • 重新组织索引:ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON). 这产生了微不足道的影响。
  • 将 LOB 列复制到另一个表,删除该列,重新创建该列,并将数据复制回来(如这篇文章所述:释放未使用的空间 SQL Server 表)。这减少了未使用的空间,但似乎只是将其转换为已用空间:

    未使用的空间

  • 使用 bcp 实用程序导出表、截断它并重新加载它(如这篇文章所述:如何为表释放未使用的空间)。这也减少了未使用的空间并增加了与上图类似的程度。

  • 即使不推荐,我也尝试了 DBCC SHRINKFILE 和 DBCC SHRINKDATABASE 命令,但它们对未使用的空间没有任何影响。
  • 跑步DBCC CLEANTABLE('myDB', 'dbo.myTable')没什么区别
  • 在保持图像和文本数据类型以及将数据类型更改为 varbinary(max) 和 …

index sql-server storage sql-server-2017

15
推荐指数
1
解决办法
1288
查看次数

释放未使用的空间 SQL Server 表

我在 SQL Server 2012 Express 中有一个表,有很多未使用的空间。

我需要释放数据库中的空间。

| 姓名 | 行 | 保留 | 数据 | INDEX_SIZE | 未使用 |
|-------------|--------|--------------|----------- ---|------------|--------------|
| 我的表名 | 158890 | 8928296 KB | 5760944 KB | 2248 KB | 3165104 KB |

如何让 SQL 释放 3165104KB?

我已经试过了:

Alter table MyTableName Rebuild
DBCC CLEANTABLE (MyDbName,"MyTableName ", 0)
ALTER INDEX ALL ON MyTableName REORGANIZE ; 
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF) 
Run Code Online (Sandbox Code Playgroud)

这是表:

CREATE TABLE [dbo].[MyTableName](
    [ImageID] [int] IDENTITY(1,1) NOT NULL,
    [DateScan] …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012

11
推荐指数
2
解决办法
3万
查看次数

我刚刚从表格列中删除了 19k 高分辨率图像,并且有一些关于缩小的问题

我们刚刚为我们的应用程序转移到一个新的图像存储方法,这意味着我们不再需要在数据库中存储图像字节数组。

为此,我UPDATE从单个表的列中删除了(通过声明)大约 19k 字节的包含高分辨率图像(大约 8 GB)的数组。如果没有图像,我不希望数据库会增长到现在的大小。再次请注意,我在这里没有删除行,只是将字段值设置为 NULL。

其他信息:

  • 列类型为 VARBINARY
  • 列上没有索引。

问题

  1. 我应该继续缩小数据库,然后为该表重建索引吗?
  2. 我读到的大多数场景都涉及在DELETE声明后缩小。我没有删除任何行,我只将所有行的字段值设置为 null。这有什么改变吗?
  3. 该列现已弃用,我们可能只想将其从表中删除;我相信这将需要重新创建表。我应该在删除列之前还是之后缩小数据库?

编辑: 我刚刚想到了另一种可能性。随着图像数据消失,最好只编写一个脚本来完全重建整个数据库,而没有列图像列。想法?

shrink sql-server-2016

2
推荐指数
1
解决办法
492
查看次数