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

Is there any performance impact on having NULLs on Foreign key column in a Data mart

我们目前正在进行数据集市设计。我们有许多 外键 用于维度表。我们正在考虑是否允许在外键维度字段中使用 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 是否会对性能产生影响?

Kimball 是对的(他通常是这样)。在使用 NULL.

的地方使用默认值

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

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

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

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

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

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

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

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