为什么重复表的大小比原始大小小?

时间:2016-09-01 19:26:21

标签: sql-server indexing storage select-into

我有一个表[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在复制所有数据时正在对数据进行大量优化/重组,但我正在寻找一个很好的解释,说明为什么在原始表中会有如此多的浪费空间。是否有一些维护,我可以/应该偶尔在桌子上运行,以防止这种膨胀?

1 个答案:

答案 0 :(得分:0)

一个可能的原因是原始表有一个或多个可变长度列被删除。在这种情况下,请尝试使用DBCC CLEANTABLE

第二个可能的原因是碎片,尝试用查询检查它:

select a.index_id, name, avg_fragmentation_in_percent  
    from sys.dm_db_index_physical_stats (DB_ID(N'YourDatabase'), OBJECT_ID(N'ExampleSource'), NULL, NULL, NULL) a
    join sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id

如果某些索引碎片化,请重新组织它们:

ALTER INDEX Index_name on Table_Name REORGANIZE WITH (LOB_COMPACTION=ON)

如果这没有多大帮助,请尝试使用“ALTER INDEX REBUILD”(并删除并重新创建索引作为最后选择)。