平板的红移性能与尺寸和事实的关系

pra*_*ash 5 data-warehouse dimensional-modeling amazon-redshift

我正在尝试在平面OLTP表上创建尺寸模型(不在3NF中)。

有些人认为维度模型表不是必需的,因为报告的大多数数据都显示为单个表。但是该表包含的内容超出了我们所需的300列。我还是应该将平面表划分为维度和事实,还是直接在报表中使用平面表?

Joh*_*ein 5

当纯粹为了报告目的而创建表时(这在数据仓库中很常见),通常会使用非标准化数据创建宽而平坦的表,因为:

\n\n
    \n
  • 查询起来更方便
  • \n
  • 它避免了对于普通用户来说可能令人困惑且容易出错的 JOIN
  • \n
  • 查询运行速度更快(特别是对于使用列式数据存储的数据仓库系统)
  • \n
\n\n

此数据格式非常适合报告,但不适合应用程序的正常数据存储\xe2\x80\x94 用于 OLTP 的数据库应使用规范化表。

\n\n

不要担心有大量列\xe2\x80\x94 这对于数据仓库来说是很正常的。然而,300 列听起来确实相当大,并且表明它们不一定被明智地使用。因此,您可能需要检查它们是否是必需的。

\n\n

许多列的一个很好的例子是拥有可以轻松编写 WHERE 子句的标志,例如WHERE customer_is_active不必连接到另一个表并确定他们在过去 30 天内是否使用过该服务。这些列每天都需要重新计算,但是对于查询数据来说非常方便。

\n\n

底线:使用数据仓库时,您应该将易用性置于性能之上。然后,了解如何使用数据仓库系统(例如 Amazon Redshift)来优化访问,该系统旨在非常有效地处理此类数据。

\n


Nat*_*ths 5

您已经问了一个有关数据仓库的数据库建模的通用问题,它将为您提供通用的答案,而这些答案可能不适用于您正在使用的数据库平台-如果您想要可以使用的答案那么我建议您更具体一些。

问号表明您正在使用Amazon Redshift,并且该数据库的答案与SQL Server和Oracle等传统关系数据库不同。

首先,您需要了解Redshift与常规关系数据库的区别:

1)这是一个大规模并行处理(MPP)系统,它由一个或多个节点组成,数据分布在这些节点上,每个节点通常完成回答每个查询所需的一部分工作。因此,跨节点分布数据的方式变得很重要,通常的目的是使数据以相当均匀的方式分布,以便每个节点为每个查询执行大约相等的工作量。

2)数据以列格式存储。这与SQL Server或Oracle的基于行的格式完全不同。在列式数据库中,数据的存储方式使大型聚合类型查询的效率大大提高。这种类型的存储部分抵消了维表的原因,因为在行中存储重复数据(附件)是相对高效的。

Redshift表通常使用列(分布键)的值分布在节点上。或者,它们可以随机但均匀分布,或者Redshift可以在每个节点上制作数据的完整副本(通常仅使用很小的表即可完成)。

因此,在决定是否创建尺寸时,您需要考虑这是否真的会带来很多好处。如果数据中有定期更新的列,则最好将它们放在另一个较小的表中,而不是更新一个较大的表。但是,如果数据主要是仅追加(不变)的,那么创建尺寸就没有任何好处。对数据进行分组和汇总的查询将在单个表上高效。

除非两个表都以相同的值(例如,用户ID)进行分配,否则在Redshift上,JOIN可能变得非常昂贵-如果不是,则Redshift将必须在节点周围物理复制数据才能运行查询。因此,如果必须具有维度,则需要将最大的维度表与事实表分配在同一键上(请记住,每个表只能分布在一个列上),那么可能需要分配任何其他维度作为ALL(复制到每个节点)。

我的建议是只使用一个表,除非您迫切需要创建维(例如,如果某些列经常更新)。