【问题标题】:snowflake is better than indexing?雪花比索引好?
【发布时间】:2012-12-27 08:41:27
【问题描述】:

这是问题所在,我有一个销售信息表,其中包含销售信息,其中包含(主键 ID、产品名称、产品 ID、商店名称、商店 ID、销售日期)等列。我想做分析,比如向上钻取和向下钻取商店/产品/销售日期。

我正在考虑两种设计方案,

  1. 为产品名称、产品 ID、商店名称、商店 ID、销售日期等列创建单独的索引;
  2. 使用数据仓库雪花模型,将当前销售信息表作为事实表,创建产品、店铺、销售日期维度表。

为了有更好的分析性能,听说雪花模型更好。但是从数据库设计的角度来看,为什么它比相关列上的索引更好呢?

提前致谢, 林

【问题讨论】:

    标签: database performance data-warehouse snowflake-schema


    【解决方案1】:

    了解您的应用使用模式以及您想要优化的内容很重要。以下是选择其中一个而不是另一个的几个原因(在众多原因中)。

    标准化雪花 PRO:

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

    更轻松的修改和更好的数据完整性。假设一家商店更改了名称。在雪花中,您更改一行,而在大型非规范化表中,每次出现时都必须更改它,并且您经常会遇到拼写错误和同名的多个变体。

    非规范化宽表 PRO:

    单条记录加载速度更快。当您通常只加载一条记录或少量记录时,将所有数据放在一行中只会导致一次缓存未命中或磁盘读取,而在雪花中,数据库可能必须从不同磁盘位置的多个表中读取。这更像是 NoSQL 数据库如何存储与键关联的“对象”。

    【讨论】:

    • 谢谢 dkamins。为什么您将索引基础解决方案(我的问题中的选项 1)称为非规范化?如果您可以展示一个示例或详细说明,请不胜感激。
    • 另一个问题是,对于您的 cmets,“当您最常加载单个记录或少量记录时”,如果要处理的记录数不小,为什么雪花比基于索引的解决方案?
    • @LinMa,阅读更多关于en.wikipedia.org/wiki/Database_normalization 的信息。此外,对于许多记录来说,雪花并不是更好的性能——它是非规范化对于单个记录加载来说更快。
    • @LinMa,在搜索数据时,雪花中关联的维度表通常可以完全加载到内存中(由于规范化/缺乏重复),因此数据库读取主表时,它可以由于只需要读取键而不是一遍又一遍地读取相同的数据,因此可以更快地从磁盘读取它并更快地在行中移动。
    • @LinMa,是的,是的——你似乎理解了这些问题。但是,您可能会给予指数更多的信任,而不是应得的。通常,索引仅包含被索引的实际数据和指向行的指针。因此(取决于您的查询)您通常仍会最终读取实际行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2017-08-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多