对数据集市中的外键列使用 NULL 是不是有任何性能影响

Posted

技术标签:

【中文标题】对数据集市中的外键列使用 NULL 是不是有任何性能影响【英文标题】:Is there any performance impact on having NULLs on Foreign key column in a Data mart对数据集市中的外键列使用 NULL 是否有任何性能影响 【发布时间】:2016-10-26 18:45:16 【问题描述】:

我们目前正在进行数据集市设计。我们有许多 外键 用于维度表。我们正在考虑是否允许在外键维度字段中使用 NULL 或使用 -1 来表示 NULL 值。

Kimball 建议保留 NULL 值的默认行。 http://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/dimensional-modeling-techniques/fact-table-null/

我的领导建议将NULL 保留为NULL

在外键字段中保留NULL 是否会对性能产生影响?

【问题讨论】:

【参考方案1】:

Kimball 是对的(正如他通常所说的那样)。在您将使用 NULL 的地方使用默认值。

为什么?它确保连接到维度不会“意外”过滤行。尝试协调来自不同查询的结果会占用大量时间。确保连接成功是减少此类差异的一种方法。

如果您不打算听从他的建议,请使用NULL 进行存储。像-1 这样的值特别糟糕——因为它会阻止数据库强制执行外键约束。

【讨论】:

我同意你的观点。我们将在 NULL 的情况下使用 -1。【参考方案2】:

另一个 Gordon 没有提到的避免使用 NULL 的原因:不清楚 NULL 的含义。

有时您在数据集市或数据仓库中有 NULL,因为 ETL 或源系统中出现问题,导致 NULL。其他时候你有一个 NULL 因为该列不适用于该特定行。或者在累积快照表之类的情况下,因为该列尚未填充,因为所报告的进程尚未达到填充该列的点。

我喜欢设置多个而不是单个默认值;例如,您可以将每个维度设置为具有指示“未知”的行,您可以将其用于缺失值,并设置一个指示“N/A”的行,用于该值不适用的情况。我倾向于为键设置负整数(-1 是未知,-2 是 N/A 等),因为这允许我在每个表中对这些行使用相同的键。但正如 Kimball 和 Gordon 所指出的,您实际上应该在维度中创建这些行。

这使得运行数据质量检查以查找出现问题的情况变得非常容易。这意味着您可以在任何报告或分析工具中显示一些有意义的值,以便人们可以根据需要过滤掉尚未完全填充的行,或者您的数据管理员可以通过这些工具查找有问题的数据。或者,也许人们可能想专门寻找其中一个维度不适用的那些行。

如果您遇到数据有时以“错误”顺序加载的情况(即填充了事实表,但尚未向相关维度成员添加维度),您还可以使用它来检查需要在您的 ETL 中更新并自动修复问题,而无需重复尝试更新那些不需要更新的行,因为它们总是有 NULL。

当其他人接管此数据集市的支持时,他们会非常感激,因为他们不必花费大量时间来判断那些 NULL 或 -1 是否表示存在问题。

【讨论】:

以上是关于对数据集市中的外键列使用 NULL 是不是有任何性能影响的主要内容,如果未能解决你的问题,请参考以下文章

MySQL是不是自动索引外键列?

映射到多个主键的外键列

8. EF Core 外键的删除模式

Oracle中禁用了外键约束对系统有没有影响

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增

MySQL外键设置中的的 CascadeNO ACTIONRestrictSET NULL