SQL Server:为什么';稀疏';不影响空间吗?

SQL Server:为什么';稀疏';不影响空间吗?,sql,sql-server,sparse-columns,Sql,Sql Server,Sparse Columns,为什么alter table alter column SPARSE在情况1-3中不起作用,而只在情况4中起作用? 也就是说,我们是否可以说,只有在创建时,列才能声明为稀疏 我已经在SQL2012中测试了这段代码 -- 1 CREATE TABLE UnSparsed(ID INT IDENTITY(1,1), FirstCol INT, SecondCol VARCHAR(100), ThirdCol SmallDateTime) GO INSERT INTO UnSparsed SELEC

为什么alter table alter column SPARSE在情况1-3中不起作用,而只在情况4中起作用? 也就是说,我们是否可以说,只有在创建时,列才能声明为稀疏

我已经在SQL2012中测试了这段代码

-- 1
CREATE TABLE UnSparsed(ID INT IDENTITY(1,1),
FirstCol INT,
SecondCol VARCHAR(100),
ThirdCol SmallDateTime)
GO

INSERT INTO UnSparsed SELECT TOP 50000 NULL,NULL, NULL
FROM master..spt_values v1, 
     master..spt_values v2

GO
sp_spaceused 'UnSparsed'
GO
--- 2
alter table UnSparsed alter column FirstCol int SPARSE NULL
alter table UnSparsed alter column SecondCol VARCHAR(100) SPARSE NULL
alter table UnSparsed alter column ThirdCol SmallDateTime  SPARSE NULL
GO
sp_spaceused 'UnSparsed'
GO
--- 3
truncate table UnSparsed
GO
INSERT INTO UnSparsed SELECT TOP 50000 NULL,NULL, NULL
FROM master..spt_values v1, 
     master..spt_values v2

GO
sp_spaceused 'UnSparsed'
GO
DROP TABLE UnSparsed
GO
--- 4
CREATE TABLE UnSparsed(ID INT IDENTITY(1,1),
FirstCol INT SPARSE NULL,
SecondCol VARCHAR(100)  SPARSE NULL,
ThirdCol SmallDateTime  SPARSE NULL)
GO
INSERT INTO UnSparsed SELECT TOP 50000 NULL,NULL, NULL
FROM master..spt_values v1, 
     master..spt_values v2

GO
sp_spaceused 'UnSparsed'
GO

似乎需要这样做

ALTER TABLE t REBUILD; 

执行此操作后,一切正常。

可能重复,但在您的情况下,您没有用于重建的聚集索引,因此需要重新创建表或添加和删除CI。我有一些大型表,希望对一些真正稀疏的列应用属性“稀疏”。这是否意味着它并不总是减少现有的表空间?@Oleg,只有在固定宽度的列上才需要稀疏,以允许它们在设置为NULL时不占用那么多空间;可变宽度列(即您的
SecondCol VARCHAR(100)
)上不需要它,因为它们在为空时自然不会占用任何空间。是的,谢谢,我知道了。我有一些表,其中有许多包含空值的uniqueidentifier字段。