Sql-Server

更改列時會增加大量磁碟空間使用量

  • May 6, 2019

我希望這個問題對某人來說很容易回答:)

我有一個看起來像這樣的表(隱藏了不重要的列)

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 將創建一個新列,複製數據並刪除舊列。該表的空間將增加一些因素,而不僅僅是新列或舊列的大小和/或數據的平均或最大長度。原因是頁面上所有行的數據副本暫時不可能放在頁面上,因此必須生成許多新頁面。

刪除列後,它不會回收此空間。為了回收空間,您需要重建表/聚集索引。

引用自:https://dba.stackexchange.com/questions/51672