我正在将一个表从开发移动到生产服务器,将数据移动后,我发现两个表占用的磁盘,空间量不同,即使它们完全相同。我想知道是什么原因造成的,以及这是否可能带来任何影响。
以下是一个脚本,显示了两个表的结构:
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
答案 0 :(得分:0)
大小不同的原因是由于碎片。
在开发环境中,从sys.dm_db_index_physical_stats查询的结果可以看出,碎片化程度很高。当您随着时间的推移删除/更新数据导致页面无法完全填充时,就会发生这种情况(假设开发和生产中的填充因子相同)。
将数据从开发转移到生产时,碎片非常少,这就是为什么空间使用率也很低的原因。
尝试此操作以消除开发服务器上的碎片
ALTER INDEX PK_BRIDGE_TABLE ON [dbo].[BRIDGE_TABLE] REBUILD;
这应该减少碎片并减少表上使用的空间