雪花算法比索引更好用吗?

5
这是问题:我有一个包含销售信息的销售信息表,其中包含列如(主键ID、产品名称、产品ID、商店名称、商店ID、销售日期)。我想在商店/产品/销售日期上进行上钻和下钻等分析。
我正在考虑两个设计选项:
1.在类似产品名称、产品ID、商店名称、商店ID、销售日期的列上创建单独的索引; 2.使用数据仓库雪花模型,将当前销售信息表视为事实表,并创建产品、商店和销售日期维度表。
为了获得更好的分析性能,我听说雪花模型比数据库设计角度上相关列的索引更好。但为什么从数据库设计角度上来讲它更好呢?
谢谢! Lin
1个回答

3

了解您的应用使用模式和您要优化的内容非常重要。以下是选择一个而不是另一个的一些原因(其中之一)。

规范化雪花 PROs:

更快的查询和更低的磁盘和内存要求。由于每个规范化行仅具有短键而不是更长的文本字段,因此您的主要事实表变得更小。即使使用索引(除非查询可以直接由索引本身回答),通常也需要部分表扫描,较小的数据意味着更少的磁盘读取和更快的访问。

更容易进行修改并获得更好的数据完整性。假设商店更改了名称。在雪花中,您只需更改一行,而在大型反规范化表中,您必须每次更改它时都更改它,并且经常会出现拼写错误和相同名称的多个变体。

反规范化宽表 PROs:

更快的单个记录加载。当您最常加载单个记录或少量记录时,将所有数据放在一行中将仅产生一个缓存未命中或磁盘读取,而在雪花中,DB可能必须从不同的磁盘位置读取多个表。这更像是 NoSQL 数据库存储与密钥相关联的“对象”的方式。


谢谢 dkamins。为什么您称索引基础解决方案(我问题中的选项1)为非规范化?如果您能举个例子或详细说明一下,我会很感激。 - Lin Ma
另一个问题是,对于您的评论,“当您最常加载单个记录或少量记录时”,如果要处理的记录数量不小,为什么Snowflake比基于索引的解决方案性能更好? - Lin Ma
1
@LinMa,请阅读有关数据库规范化的更多信息:http://en.wikipedia.org/wiki/Database_normalization。此外,雪花模式并不是对于许多记录来说性能更好,而是在单个记录加载方面非规范化更快。 - dkamins
1
@LinMa,在搜索数据时,Snowflake中关联的维度表通常可以完全加载到内存中(由于规范化/缺乏重复),因此当数据库读取主表时,它可以更快地从磁盘读取并通过行移动得更快,因为只需要读取键而不是一遍又一遍地读取相同的数据。 - dkamins
1
@LinMa,是的,你似乎理解了这些问题。但是你可能会给索引更多的信用。通常,索引仅包含实际索引的数据和指向行的指针。因此(取决于您的查询),您最终仍然需要读取实际行。 - dkamins
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接