Sql-Server
更改列時會增加大量磁碟空間使用量
我希望這個問題對某人來說很容易回答:)
我有一個看起來像這樣的表(隱藏了不重要的列)
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
現在我對該表進行了一些索引,並且還涉及將
Name
-column 縮短為 256 寬度。但是當我更改此列時ALTER TABLE Log ALTER COLUMN Name NVARCHAR(256) NOT NULL GO
數據庫增長了不小的數量。(是的,我仔細檢查了 - 這是我在這裡所做的唯一更改)該表總共有 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 將創建一個新列,複製數據並刪除舊列。該表的空間將增加一些因素,而不僅僅是新列或舊列的大小和/或數據的平均或最大長度。原因是頁面上所有行的數據副本暫時不可能放在頁面上,因此必須生成許多新頁面。
刪除列後,它不會回收此空間。為了回收空間,您需要重建表/聚集索引。