sql-server - 删除大型表中的列时的注意事项

标签 sql-server sql-server-2005

我有一个调用数据表,已增长到 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,这清楚地表明它们是相同的。

希望这是有道理的。

关于sql-server - 删除大型表中的列时的注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5085737/

相关文章:

sql - 转换为十进制时为 "Error converting to int"

c++ - 升级到SQL Server 2005 : Cannot INSERT QNAN into float column?

c# - 以编程方式获取所有存储过程的简单方法

sql - 获取第 n 个连续组的第一行/最后一行

sql-server - 如何持续衡量 EF 绩效?

sql - SSIS - 除了脚本任务之外的任何其他解决方案

sql - SSMS 可扩展性/插件 - 获取当前数据库和服务器

sql-server - SQL Server - 表元数据

sql - 在 SQL 2005 中的 WHERE 子句中使用命名的自定义列?

sql - 如何有效地使用 SQL 连接