Sql 已将varchar(max)字段复制到其自己的表中,但新表要大得多

Sql 已将varchar(max)字段复制到其自己的表中,但新表要大得多,sql,sql-server,Sql,Sql Server,我有一个包含24个字段的数据表,其中一个字段是SQL Server 2012数据库中的varchar(max)。我试图将varchar(max)字段移动到它自己的表中,因此我创建了一个新表,其中包含两个字段,varchar(max)和初始表中行的ID。Varchar(max)只在大约四分之三的时间内填充,因此新表的行数小于源表。新表已填充有“Insert-into….Select”语句 就使用的数据空间而言,我的新表比源表大30%,尽管它只包含75%的行和10%的字段。我看不出在字段定义或联盟方

我有一个包含24个字段的数据表,其中一个字段是SQL Server 2012数据库中的
varchar(max)
。我试图将
varchar(max)
字段移动到它自己的表中,因此我创建了一个新表,其中包含两个字段,
varchar(max)
和初始表中行的ID。
Varchar(max)
只在大约四分之三的时间内填充,因此新表的行数小于源表。新表已填充有“
Insert-into….Select
”语句

就使用的数据空间而言,我的新表比源表大30%,尽管它只包含75%的行和10%的字段。我看不出在字段定义或联盟方面有什么不同,所以我很难理解它为什么会如此之大


是否还有其他的因素需要考虑?

< P>看来,使用VARCHAR(MAX)字段的SELECT表将强制SQLServer每列分配一个8K页,无论列中是否有数据。因此,即使没有数据的行也需要分配空间。更好的选择是使用CREATETABLE/INSERT INTO。请参见下面的示例:

CREATE TABLE #tmp (ID int, testdata varchar(max))
INSERT INTO #tmp VALUES(1,'test'),(2, 'test2'),(3,'again')

CREATE TABLE tblTest1(ID int, testdata varchar(max))
INSERT INTO tblTest1 SELECT ID, testdata from #tmp
SELECT ID, testdata into tblTest3 from #tmp


exec sp_spaceused tblTEst1
exec sp_spaceused tblTEst3

表有列,没有字段。谢谢你的建议,但是我用Insert…select而不是select…into创建了我的表
name        rows  reserved    data    index_size  unused

tblTest1     3      16 KB     8 KB      8 KB       0 KB

tblTest3     3      32 KB     24 KB     8 KB       0 KB