我有一个通用的日志表,大约有500万行。
有一个“强类型”字段存储事件类型,还有一堆“弱类型”列包含与事件相关的数据。也就是说,那些“错误输入”列的含义取决于事件的类型。
这些列定义为:
USER_CHAR1 nvarchar(150) null,
USER_CHAR2 nvarchar(150) null,
USER_CHAR3 nvarchar(150) null,
USER_CHAR4 nvarchar(150) null,
USER_CHAR5 nvarchar(150) null,
USER_INTEGER1 int null,
USER_INTEGER2 int null,
USER_INTEGER3 int null,
USER_INTEGER4 int null,
USER_INTEGER5 int null,
USER_FLAG1 bit null,
USER_FLAG2 bit null,
USER_FLAG3 bit null,
USER_FLAG4 bit null,
USER_FLAG5 bit null,
USER_FLOAT1 float null,
USER_FLOAT2 float null,
USER_FLOAT3 float null,
USER_FLOAT4 float null,
USER_FLOAT5 float null
每种类型的第1列和第2列都被大量使用,但是从第3列开始,很少有事件类型会提供这么多的信息。因此,我倾向于将每种类型的3-5列标记为SPARSE
。
我首先进行了一些分析,发现确实,每个列中至少有80%的数据是null
,而在100%的数据中是null
。根据40%储蓄门槛表,SPARSE
这将是他们的一个巨大胜利。
因此,我去SPARSE
了每组中的3-5列。现在,我的表占用了大约1.8Gb的数据空间sp_spaceused
,而稀疏之前为1Gb。
我尝试过dbcc cleantable
,但是没有效果。
然后dbcc shrinkdatabase
,也没有效果。
感到困惑,我删除SPARSE
并重复了dbcc
s。该表的大小保持在1.8Gb。
是什么赋予了?
将尝试并繁殖。万一它有什么区别,表是堆还是有聚簇索引?
—
马丁·史密斯
@MartinSmith是否具有聚集索引
—
Gserg
rowid int not null identity(1,1) primary key clustered
。