gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:40:11 24 4
gpt4 key购买 nike

我有一个调用数据表,已增长到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com