2017-04-25 85 views
0

在報告中,我有下從事實表聯接: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

回答

2

在你的四個問題的順序:

  1. 是的,你不應該在事實表維度鍵空白。如果源數據中的值實際上爲空或空,則應在維度表中留出成員以反映此情況。

  2. 因此,構建關1,一般情況下不應做左側的接合部事實維度時加入。我說通常是因爲可能會出現這種情況,但我不能想到任何事情。你不應該有正確設計的事實和尺寸表。

  3. 一般來說,沒有。我建議在這種情況下使用代理鍵,因爲您的業務密鑰分佈在兩列。

  4. 不知道你問這裏。如果你保留這個設計,你需要改變它們。如果您切換爲使用DimState的代理鍵,則只需更改維度表即可。

0
  1. 不要這樣做從一個簡單的原因。您將在維表中獲得13M記錄和關鍵字L.Province = 'Other' - 事實表中的每個記錄將與這13M維記錄一起加入,導致大量重複測量。

正確的答案是強制執行您的維上的主鍵。通常,dimnsion有一個記錄用鑰匙other(意義的關鍵是不知道)和可能的另一個recrod NA(尺寸在該事實記錄沒有意義)。

  • 的問題是不是在OUTER join - 應該怎樣通過設計來強制執行是在事實表的所有外鍵維度表中定義。

    一步實現這一目標是在1

  • 這種做法背後的基本原理是強制執行內部和外部連接導致同樣的結果,即做的NAOther的描述下定義不會導致混淆不同的結果。

  • 再次每個維度應已經定義了一個PRIMARY KEY - 如果PK由兩列 - 在加入關於這些列是好的。 (DWh中的典型場景雖然是單列數字PK)。
  • 什麼應該是加號LIKESUBSTR - 這表明尺寸PK沒有明確定義。

    1. 如果您的維度有兩列PK Locale + province事實表必須更新爲包含這兩列作爲FK。
    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:在加入需要多列是沒有問題的,但我會很在意多柱連接使用通配符。我希望你的維度中有一個粒度問題。我不知道您的數據,但使用通配符可能會從該維度獲取多個值。