Jas*_*aat 9 sql-server sql-server-2005
我有一个调用数据表,已增长到13亿行和173千兆字节的数据我们不再使用两列,一个是char(15),另一个是varchar(24).他们都已经插入NULL一段时间了,我一直推迟删除列,因为我不确定其含义.我们在带有数据库的驱动器和带有事务日志的驱动器上的空间有限.
另外我发现这篇帖子说在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]
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,这清楚地表明它们是相同的。
希望这是有道理的。
| 归档时间: |
|
| 查看次数: |
4251 次 |
| 最近记录: |