2011-06-09 36 views
1

当我改变一列的类型中,以实际较小的类型:SQL服务器:一台双数据大小改变列类型

-- change type from nvarchar(100) to varchar(50) 
Alter Table [MyTable] Alter column [MyColumn] varchar(50) 

表包含4 Mio.记录。在使用大约1.1 GB的空间之前,在更改列之后,它使用了2.2 GB的空间。这有什么解释吗?

我找到了SMO使用的空间,或者通过查看sql server management studio中的表格属性:“我的表 - >属性 - >存储 - >数据空间”。现在我怀疑这是数据使用的实际空间。

回答

2

运行ALTER INDEX ALL On MyTable REBUILD,然后用“真”标志

基本上,在类型的变化已经支离破碎存储再次检查空间莫名其妙:比如现在可为空,这是没有影响的前磁盘上的结构。我选择这个例子是因为你没有在你的ALTER TABLE中指定NULL/NOT NULL

+0

就是这样。重建索引后,它回到1.1 GB。桌子碎裂时使用的空间变得更高,这仍然很有趣。我相信这是衡量表中数据量的一种方式,但它更多地说明它在磁盘上占用了多少空间。 – 2011-06-09 11:40:34

+0

@Stefan Steinegger:正确,它分配了空间。数据类型的改变可能无法确定每8k页面(页面密度)的行数可能如何,因此您在磁盘上具有相同的结构。你所拥有的只是每页中的数据略少。 – gbn 2011-06-09 11:48:13

0

使用sp_spaceused,您可以获取有关表格使用空间的更多信息。

EXEC sp_spaceused @objname = N'dbo.MyTable' ,@updateusage = N'TRUE'; 
+0

相同:它显示的数据大小为2307256 KB,索引大小为788488 KB。 – 2011-06-09 11:16:53

相关问题