最近有点疑惑,求解答。
通常,在设计数据仓库时,我们要么使用星型模型,要么使用雪花模型,要么使用混合模型,通常我们将主数据规范化为维度表(当然有时出于性能考虑,去规范化)。我的问题是,规范化成维度表,或者创建各种不同的维度表,有什么好处?
如果是为了节省空间,那么 SQL Server 不同级别的压缩已经节省了空间。 例如,在一个事实表中,有一个 varchar(max) 列,它只有 1% 的唯一值,然后将其归一化为维度表,并将 key 放入事实表中,这将有助于节省空间;但是,由于 SQL 行级压缩,理论上它的工作方式相同,而是通过您自己的设计进行规范化,SQL Server 会找到字符串模式并保存在某处,行内只是指针,因此空间使用量理论上就像钥匙。
如果是为了提高查询性能,那么对于维度表,无论维度上有什么索引,都需要至少先进行非集群索引扫描/索引查找维度表获取key,再使用key获取集群索引/或 RID,然后获取完整数据。那是 2 倍的 I/O。如果没有维度,您仍然有事实表上的索引,对应的列,由于压缩,您的索引表将与您在维度表上创建索引的大小相似。所以,当你查询时,可能也是一次非集群索引扫描/集群索引查找/然后全量数据,所以I/O可能会更小,加上没有join,查询性能可能会更快.
那么,如果我已经进行了压缩,为什么还需要维度?