DW可以接受左连接吗?

DW可以接受左连接吗?

问题描述:

在报告中,我有下从事实表联接:DW可以接受左连接吗?

加入...

LEFT JOIN DimState AS s 
ON s.StateCode = l.Province AND l.Locale LIKE (s.CountryCode + '%') 

的更多信息: 事实表中有59567773行

L.Province可以匹配DimState一个StateCode :42,346,471行71%

L.Province无法匹配DimState中的StateCode:13,742,966行23%(其中大多数是L.Province中的空白值)。

L.Province为NULL在350万行(6%)

4个问题: 做-The正确的事情,将取代L.Province空白和空白的“其他” ......而有一个入口在DimState中,StateCode为“其他”,对吧?

-IS它接受的左连接于一个维度?或者它应该永远是INNER JOIN?

-is它正确加入到一个维度上的2列?

- 要做到一个l.Locale = s.CountryCode ......我应该修改l.Locale或s.CountryCode值是多少?

+0

你问这些问题,就好像他们有明确的答案,被众神判断是正确的。他们不。 “可接受的”是可以达到理想程度的效率。目前的解决方案是否会产生实际问题如果你的问题是“如何过渡这个数据库,以至于只需要一个列上的'INNER JOIN'”,那就是另一回事了,但是因为它的问题完全是主观的。或者可能是数据库模式审查的候选人(我不确定是否有SE上的主题网站 - dba.SE可能有资格)。 –

+1

我谦虚地认为他们确实有确定的答案。我不熟悉最佳实践,但是如果有人确认事实表不应该有空值或空值,那么就会回答#1。 #2只是一个有DW经验的人,如果他/她同时看到了LEFT和INNER,我会怀疑LEFT JOINs会影响性能。 #3再次,有DW经验的人,如果他/她通常加入一个或两个专栏,以及DW中的标准是什么。 #4我应该修改事实还是维度,在这些情况下通常是什么? – Chicago1988

+3

@ Chicago1988数据仓库的标准做法是在事实表中不要使用维值键的NULL值。每个维度都应该有一些预留的成员,然后用它们来指示源数据中的NULL或空白数据。 – mallan1121

在你的四个问题的顺序:

  1. 是的,你不应该在事实表维度键空白。如果源数据中的值实际上为空或空,则应在维度表中留出成员以反映此情况。

  2. 因此,构建关1,一般情况下不应做左侧的接合部事实维度时加入。我说通常是因为可能会出现这种情况,但我不能想到任何事情。你不应该有正确设计的事实和尺寸表。

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

  4. 不知道你问这里。如果你保留这个设计,你需要改变它们。如果您切换为使用DimState的代理键,则只需更改维度表即可。

  1. 不要这样做从一个简单的原因。您将在维表中获得13M记录和关键字L.Province = 'Other' - 事实表中的每个记录将与这13M维记录一起加入,导致大量重复测量。

正确的答案是强制执行您的维上的主键。通常,dimnsion有一个记录用钥匙other(意义的关键是不知道)和可能的另一个recrod NA(尺寸在该事实记录没有意义)。

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

    一步实现这一目标是在1

  2. 这种做法背后的基本原理是强制执行内部和外部连接导致同样的结果,即做的NAOther的描述下定义不会导致混淆不同的结果。

    1. 再次每个维度应已经定义了一个PRIMARY KEY - 如果PK由两列 - 在加入关于这些列是好的。 (DWh中的典型场景虽然是单列数字PK)。
    2. 什么应该是加号LIKESUBSTR - 这表明尺寸PK没有明确定义。

      1. 如果您的维度有两列PK Locale + province事实表必须更新为包含这两列作为FK。
    开始=“3”>
开始=“2”>

要建立在什么mallan1121说:

1:通常有三种为空不同的含义/数据仓库空白。

答:我不知道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:在加入需要多列是没有问题的,但我会很在意多柱连接使用通配符。我希望你的维度中有一个粒度问题。我不知道您的数据,但使用通配符可能会从该维度获取多个值。