更改列时会增加大量磁盘空间使用量

DrC*_*ste 3 sql-server database-size alter-table disk-space auto-growth

我希望这个问题对某人来说很容易回答:)

我有一个看起来像这样的表(隐藏了不重要的列)

CREATE TABLE [dbo].[Log](
    [LogID] [int] IDENTITY(1,1) NOT NULL,
    --several other columns
    [Name] [nvarchar](512) NOT NULL,
 CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED 
(
    [LogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

现在我对该表做了一些索引,这也涉及将Name-column缩短到 256 宽度。但是当我更改此列时

ALTER TABLE Log ALTER COLUMN Name NVARCHAR(256) NOT NULL
GO
Run Code Online (Sandbox Code Playgroud)

数据库增长了一个不平凡的数量。(是的,我仔细检查了 - 这是我在这里所做的唯一更改)该表总共有 90746 个条目,在更改表之前,SSMS 表示大小为 247.56MB。

但是在这次更新之后,数据库增长到了 336.13MB。

不知道这在这里是否重要,但SELECT @@VERSION得到Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) Mar 29 2009 10:11:52 Copyright (c) 1988-2008 Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

怎么会这样?有人可以解释一下吗?

更新:我试过DBCC SHRINKDATABASE (myyDB, 0);这导致了一个 268.81MB 的较小的数据库,但这仍然比原始数据库大小更大,列更宽,我仍然不明白 :)

Aar*_*and 6

SQL Server 将创建一个新列,复制数据,然后删除旧列。表的空间会增加一些因素,而不仅仅是新列或旧列的大小和/或数据的平均或最大长度。原因是页面上所有行的数据副本暂时不可能适合该页面,因此必须生成许多新页面。

删除列后,它不会回收此空间。为了回收空间,您需要重建表/聚集索引。