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 的较小的数据库,但这仍然比原始数据库大小更大,列更宽,我仍然不明白 :)
SQL Server 将创建一个新列,复制数据,然后删除旧列。表的空间会增加一些因素,而不仅仅是新列或旧列的大小和/或数据的平均或最大长度。原因是页面上所有行的数据副本暂时不可能适合该页面,因此必须生成许多新页面。
删除列后,它不会回收此空间。为了回收空间,您需要重建表/聚集索引。