在大表中删除列时的注意事项

Jas*_*aat 9 sql-server sql-server-2005

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

另外我发现这篇帖子说在DBCC REINDEX完成之前这个空间是不可用的.我认为这既好又坏.这很好,因为删除列应该非常快并且不涉及大量日志记录,但是因为空间不会被回收而很糟糕.新插入的记录会占用更少的空间吗?在我的情况下,这将是好的,因为我们在18个月后修剪旧数据,因此空间将逐渐减少.

如果我们做了DBCC REINDEX(或ALTER INDEX REBUILD)那会真的有帮助,因为列不是任何索引的一部分吗?这会占用日志空间还是锁定表格以使其无法使用?

Pav*_*dov 3

我发现你的问题很有趣,所以决定在开发数据库上对其进行建模。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] 
Run Code Online (Sandbox Code Playgroud)

该表包含 1200 万条记录。

sp_spaceused big_table, true

name-big_table, rows-12031303, reserved-399240 KB, data-397760 KB, index_size-1336 KB, unused-144 KB. 
Run Code Online (Sandbox Code Playgroud)

删除列

sp_spaceused big_table, true
Run Code Online (Sandbox Code Playgroud)

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

向表的其余部分添加 300 万行

name-big_table, rows-15031303, reserved-511816 KB, data-509904 KB, index_size-1752 KB, unused-160 KB.
Run Code Online (Sandbox Code Playgroud)

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

DBCC DBREINDEX( big_table )
Run Code Online (Sandbox Code Playgroud)

日志大小相同,但数据库大小增加到 866 Mb

name-big_table, rows-12031303, reserved-338376 KB, data-337704  KB, index_size-568 KB, unused-104 KB. 
Run Code Online (Sandbox Code Playgroud)

再次添加 300 万行,看看它们是否进入数据库中的可用空间。数据库大小相同,均为 3.96 GB,这清楚地表明它们是相同的。

希望这是有道理的。