为什么两个具有相同结构和数据的表占用不同的磁盘空间?

时间:2019-06-14 18:03:45

标签: sql-server

我正在将一个表从开发移动到生产服务器,将数据移动后,我发现两个表占用的磁盘,空间量不同,即使它们完全相同。我想知道是什么原因造成的,以及这是否可能带来任何影响。

以下是一个脚本,显示了两个表的结构:

    CREATE TABLE [dbo].[BRIDGE_TABLE](
           [Column1_fk] [date] NOT NULL,
           [Column2_fk] [int] NOT NULL,
    CONSTRAINT [PK_BRIDGE_TABLE] PRIMARY KEY CLUSTERED
    (
           [Column1_fk] ASC,
           [Column2_fk] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[BRIDGE_TABLE]  WITH CHECK ADD  CONSTRAINT [FK_BRIDGE_TABLE_1] FOREIGN KEY([Column1_fk]) REFERENCES [dbo].[PARENT_TABLE_1] ([KeyColumn])
    GO

    ALTER TABLE [dbo].[BRIDGE_TABLE]  WITH CHECK ADD  CONSTRAINT [FK_BRIDGE_TABLE_2] FOREIGN KEY([Column2_fk]) REFERENCES [dbo].[PARENT_TABLE_2] ([KeyColumn])
    GO

这是sp_spacedused的结果,显示磁盘使用率的差异。

 Table Name          |rows       |reserved     |data       |index_size    |unused 
 --------------------|-----------|-------------|-----------|--------------|------ 
 Dev_Table           |98072577   |2502000 KB   |2491696 KB |9808 KB       |496 KB
 --------------------|-----------|-------------|-----------|--------------|------ 
 Production_Table    |98072577   |1560264 KB   |1550560 KB |7040 KB       |2664 KB

编辑:添加了来自sys.dm_db_index_physical_stats查询的结果

tableName  |index_id |index_type_desc  |record_count |page_count |fragment_count |ghost_record_count |avg_record_size_in_bytes
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |98072577     |311462     |292268         |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |311462       |1206       |1206           |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |1206         |5          |5              |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Dev_Table  |     1   |CLUSTERED INDEX  |5            |1          |1              |0                  |14
tableName  |index_id |index_type_desc  |record_count |page_count |fragment_count |ghost_record_count |avg_record_size_in_bytes
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |98072577     |193820     |2686           |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |193820       |867        |867            |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |867          |3          |3              |0                  |14
-----------|---------|-----------------|-------------|-----------|---------------|-------------------|------------------------
Prod_Table |      1  |CLUSTERED INDEX  |3            |1          |1              |0                  |14

1 个答案:

答案 0 :(得分:0)

大小不同的原因是由于碎片。

在开发环境中,从sys.dm_db_index_physical_stats查询的结果可以看出,碎片化程度很高。当您随着时间的推移删除/更新数据导致页面无法完全填充时,就会发生这种情况(假设开发和生产中的填充因子相同)。

将数据从开发转移到生产时,碎片非常少,这就是为什么空间使用率也很低的原因。

尝试此操作以消除开发服务器上的碎片

ALTER INDEX PK_BRIDGE_TABLE ON [dbo].[BRIDGE_TABLE] REBUILD;

这应该减少碎片并减少表上使用的空间