我在生产数据库中有一个表,其大小为 525 GB,其中 383 GB 未使用:
我想回收其中的一些空间,但是,在弄乱生产数据库之前,我正在测试数据库中数据较少的相同表上测试一些策略。这个表有一个类似的问题:
关于表的一些信息:
服务器正在运行 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 CLEANTABLE('myDB', 'dbo.myTable')
没什么区别我在 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) 我们刚刚为我们的应用程序转移到一个新的图像存储方法,这意味着我们不再需要在数据库中存储图像字节数组。
为此,我UPDATE
从单个表的列中删除了(通过声明)大约 19k 字节的包含高分辨率图像(大约 8 GB)的数组。如果没有图像,我不希望数据库会增长到现在的大小。再次请注意,我在这里没有删除行,只是将字段值设置为 NULL。
其他信息:
DELETE
声明后缩小。我没有删除任何行,我只将所有行的字段值设置为 null。这有什么改变吗?编辑: 我刚刚想到了另一种可能性。随着图像数据消失,最好只编写一个脚本来完全重建整个数据库,而没有列图像列。想法?