DW可接受的左连接?

时间:2017-04-25 14:55:37

标签: sql-server data-warehouse

在报告中,我从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中的值吗?

3 个答案:

答案 0 :(得分:2)

按照你的四个问题顺序:

  1. 是的,您的事实表中的维度键不应该有空格。如果源数据中的值实际上为null或为空,则维度表中应该有成员用于反映这一点。

  2. 因此,建立1时,在将事实与维度相关联时,通常不应该执行左连接。我说一般是因为可能存在必要的情况,但我无法想到任何一个问题。您不应该使用正确设计的事实和维度表。

  3. 一般来说,没有。在这种情况下,我建议使用代理键,因为您的业务键分布在两列中。

  4. 不确定你在这里问的是什么。如果你保留这个设计,你需要改变它们。如果切换到使用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)

  1. 不要这样做,原因很简单。您将在维度表中获得带有密钥L.Province = 'Other'的13M记录 - 来自具有s.StateCode = 'Other'的事实表中的每条记录将与这些13M维度记录相结合,从而导致大量重复这些度量。
  2. 正确的答案是强制维度上的主键。通常情况下,dimnsion有一条记录,密钥为other(意思是密钥未知),另外还有一条recrod NA(该维度对此事实记录没有意义) )。

    1. 问题不在OUTER join中 - 设计应强制执行的是事实表中的所有外键都在维度表中定义。

      实现这一目标的一个步骤是1中所述的NAOther的定义。

    2. 这种方法的基本原理是强制INNER和OUTER联接导致相同的结果,即不会导致混淆不同的结果。

      1. 同样,每个维度都应该定义一个PRIMARY KEY - 如果PK由两列组成 - 那些列上的连接就可以了。 (DWh中的典型场景虽然是单列数字PK)。
      2. 应该加入的是LIKESUBSTR加入 - 这表明维度PK没有明确定义。

        1. 如果您的维度有两列PK Locale + province,则必须更新事实表以将此两列包含为FK。