我有一个表 [ExampleSource],其中 SQL Server Management Studio 指示以下存储统计信息:
- 索引空间:58 MB
- 行数:28269319
- 数据空间:4,567 MB
我使用以下命令复制了该表,目的是对各种索引配置进行基准测试:
SELECT *
INTO [ExampleSource_Test]
FROM [ExampleSource]
查询一结束,我就注意到了一些令人惊讶的事情。新测试表中的数据量大大减小:
- 索引空间:0.016 MB
- 行数:28269319
- 数据空间:2,820 MB
新表具有相同的数据,只是没有索引/主键。我在新的 Test 表中添加了一个主键(与原始键相同),结果如下:
- 索引空间:22.227 MB
- 行数:28269319
- 数据空间:2,820 MB
添加密钥并没有增加数据空间也就不足为奇了。
如果有帮助,这是表结构:
CREATE TABLE [dbo].[ExampleSource]
(
[C1] [bigint] NOT NULL,
[C2] [nvarchar](9) NOT NULL,
[C3] [nvarchar](5) NOT NULL,
[C4] [int] NOT NULL,
[C5] [nvarchar](1) NOT NULL,
[C6] [int] NOT NULL,
[C7] [bit] NOT NULL,
[C8] [date] NULL,
[C9] [decimal](29, 9) NULL,
[C10] [nvarchar](max) NULL,
[C11] [nvarchar](1) NULL,
[C12] [decimal](29, 9) NULL,
[C13] [nvarchar](3) NULL,
CONSTRAINT [PK_ExampleSource]
PRIMARY KEY CLUSTERED ([C2] ASC, [C3] ASC, [C4] ASC, [C5] ASC, [C6] ASC, [C1] DESC)
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]
原始表是随着时间的推移多次插入的结果——通常一次插入几千个。没有更新或删除。我想知道是什么导致了与原始表(对于索引和数据)的这种巨大空间差异?我猜测 SQL Server 在一次复制所有数据时正在对数据进行大量优化/重组,但我正在寻找一个很好的解释来解释为什么原始表中可能会浪费这么多空间。是否有一些我可以/应该偶尔在桌子上运行以防止这种膨胀的维护?