【发布时间】:2013-03-16 04:34:27
【问题描述】:
最近有点疑惑,求解答。
通常,在设计数据仓库时,我们要么使用星型模型,要么使用雪花模型,要么使用混合模型,通常我们将主数据规范化为维度表(当然有时出于性能考虑,去规范化)。我的问题是,规范化成维度表,或者创建各种不同的维度表,有什么好处?
如果是为了节省空间,那么 SQL Server 不同级别的压缩已经节省了空间。 例如,在一个事实表中,有一个 varchar(max) 列,它只有 1% 的唯一值,然后将其归一化为维度表,并将 key 放入事实表中,这将有助于节省空间;但是,由于 SQL 行级压缩,理论上它的工作方式相同,而是通过您自己的设计进行规范化,SQL Server 会找到字符串模式并保存在某处,行内只是指针,因此空间使用量理论上就像钥匙。
如果是为了提高查询性能,那么对于维度表来说,无论你在维度上有什么索引,你至少需要先进行非集群索引扫描/索引查找你的维度表才能得到key,然后使用 key 获取集群索引/或 RID,然后获取完整数据。那是 2 倍的 I/O。如果没有维度,您仍然有事实表上的索引,对应的列,由于压缩,您的索引表将与您在维度表上创建索引的大小相似。所以,当你查询时,可能也是一次非集群索引扫描/集群索引查找/然后全量数据,所以I/O可能会更小,加上没有join,查询性能可能会更快.
那么,如果我已经进行了压缩,为什么还需要维度?
【问题讨论】:
-
一个设计良好的星型模式是通过使用尽可能小的数据类型来压缩的。我在这里没有看到真正的问题。尺寸便于最终用户进行切片/切块。
-
您能否分享更多关于“精心设计的星型模式是通过使用可能的最小数据类型来压缩的”的。还有维度是为了最终用户方便切片/切块,最终用户真的会使用维度表还是大多数情况下他们只是使用视图?
-
分析完全非规范化的表与星型模式的难度如何?
标签: sql sql-server-2008 ssas data-warehouse business-intelligence