我有一张已增长到13亿行和173 GB数据的调用数据表。我们不再使用两列,一列是char(15),另一列是varchar(24)。他们都已经使用NULL插入了一段时间,我一直推迟删除列,因为我不确定其中的含义。具有数据库的驱动器和具有事务日志的驱动器上的空间都有限。

另外,我发现this post表示在完成DBCC REINDEX之前该空间不可用。我认为这既好又坏。很好是因为删除列应该非常快,并且不涉及大量日志记录,但是不好是因为不会回收空间。新插入的记录会占用更少的空间吗?就我而言,这很好,因为我们在18个月后修剪旧数据,因此空间将逐渐减小。

如果我们执行了DBCC REINDEX(或ALTER INDEX REBUILD),那么这实际上会有所帮助,因为列不属于任何索引吗?那会占用日志空间或锁定表以使其无法使用吗?

最佳答案

我发现您的问题很有趣,因此决定在开发数据库上对其进行建模。
SQL Server 2008,数据库大小为400 Mb,日志为2.4 Gb。
我假设,从提供的链接开始,您创建了具有聚簇索引的表:

CREATE TABLE [dbo].[big_table](
    [recordID] [int] IDENTITY(1,1) NOT NULL,
    [col1] [varchar](50) NOT NULL,
    [col2] [char](15) NULL,
    [col3] [varchar](24) NULL,
 CONSTRAINT [PK_big_table] PRIMARY KEY CLUSTERED
(
    [recordID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

该表包括1200万条记录。
sp_spaceused big_table, true

name-big_table, rows-12031303, reserved-399240 KB, data-397760 KB, index_size-1336 KB, unused-144 KB.

删除列
sp_spaceused big_table, true

表大小保持不变。数据库和日志大小保持不变。

将300万行添加到表的其余部分
name-big_table, rows-15031303, reserved-511816 KB, data-509904 KB, index_size-1752 KB, unused-160 KB.

数据库大小500 Mb,日志3.27 Gb。


DBCC DBREINDEX( big_table )

日志大小相同,但是数据库大小增加到866 Mb
name-big_table, rows-12031303, reserved-338376 KB, data-337704  KB, index_size-568 KB, unused-104 KB.

再次添加300万行,看它们是否进入数据库的可用空间。
数据库大小是相同的,日志3.96 Gb,清楚地表明了它们的大小。

希望有道理。

09-25 19:14