在报告中,我从FACT表中接下来加入:
...加入</ P>
LEFT JOIN DimState AS s
ON s.StateCode = l.Province AND l.Locale LIKE (s.CountryCode + '%')
更多信息: 事实表有59,567,773行
L.Province可以匹配DimState中的StateCode:42,346,471行71%
L.Province无法匹配DimState中的StateCode:13,742,966行23%(其中大多数是L.Province中的空值)。
L.Province在3,500,000行(6%)中为NULL
4个问题: - 正确的做法是替换L.Province Nulls和空白为“其他”...并在DimState中有一个条目,StateCode为“other”,对吗?
- LEFT JOIN到维度是否可以接受?或者它应该始终是INNER JOIN?
- 加入2列的维度是否正确?
- 要执行l.Locale = s.CountryCode ...我应该修改l.Locale或s.CountryCode中的值吗?
答案 0 :(得分:2)
按照你的四个问题顺序:
是的,您的事实表中的维度键不应该有空格。如果源数据中的值实际上为null或为空,则维度表中应该有成员用于反映这一点。
因此,建立1时,在将事实与维度相关联时,通常不应该执行左连接。我说一般是因为可能存在必要的情况,但我无法想到任何一个问题。您不应该使用正确设计的事实和维度表。
一般来说,没有。在这种情况下,我建议使用代理键,因为您的业务键分布在两列中。
不确定你在这里问的是什么。如果你保留这个设计,你需要改变它们。如果切换到使用DimState的代理键,只需更改任何内容即可更新维度表。
答案 1 :(得分:2)
建立在mallan1121所说的基础之上:
1:数据仓库中的null / blank通常有三种不同的含义。
一个。我不知道价值
B中。该值已知且为空白
℃。该值不适用。
在设计仓库时,请务必考虑每个选项的相关性。事实上应该始终引用维度密钥,否则最终会出现数据质量问题。
2:如果您使用视图从多维数据集中抽象表(一个好主意)并且您可以将这些视图用于非多维数据集报表,则使用左联接会很有用。原因是内部联接是一个过滤联接,结果集由所有内部联接表过滤,即使只返回一个列。
SELECT DimA.COLUMN, Fact.COLUMN
FROM Fact
JOIN DimA
JOIN DimB --filters result
JOIN DimC --filters result
如果使用左连接,并且只需要某些表中的列,则忽略其他连接,并且永远不会访问这些表。
SELECT DimA.COLUMN, Fact.COLUMN
FROM Fact
LEFT JOIN DimA
LEFT JOIN DimB --ignored
LEFT JOIN DimC --ignored
这可以加快直接针对SQL数据库运行的报告查询。但是,您必须确保您的ETL过程强制执行完整性,并且无论是使用内部连接还是左连接,返回的结果都是相同的。
4:在连接中需要多个列不是问题,但我非常担心使用通配符进行多列连接。我希望您的维度中存在粒度问题。我不知道您的数据,但使用通配符可能会从该维度获取多个值。
答案 2 :(得分:0)
L.Province = 'Other'
的13M记录 - 来自具有s.StateCode = 'Other'
的事实表中的每条记录将与这些13M维度记录相结合,从而导致大量重复这些度量。正确的答案是强制维度上的主键。通常情况下,dimnsion有一条记录,密钥为other
(意思是密钥未知),另外还有一条recrod NA
(该维度对此事实记录没有意义) )。
问题不在OUTER join
中 - 设计应强制执行的是事实表中的所有外键都在维度表中定义。
实现这一目标的一个步骤是1中所述的NA
和Other
的定义。
这种方法的基本原理是强制INNER和OUTER联接导致相同的结果,即不会导致混淆不同的结果。
PRIMARY KEY
- 如果PK由两列组成 - 那些列上的连接就可以了。 (DWh中的典型场景虽然是单列数字PK)。应该加入的是LIKE
或SUBSTR
加入 - 这表明维度PK没有明确定义。
Locale + province
,则必须更新事实表以将此两列包含为FK。