歡迎關注天善智能微信公眾號,我們是專注于商業智能BI,大數據,數據分析領域的垂直社區。 對商業智能BI、大數據分析挖掘、機器學習,python,R等數據領域感興趣的同學加微信:tstoutiao,邀請你進入頭條數據愛好者交流群,數據愛好者們都在這兒。
一般來說,是不需要環狀模型的,環狀模型通常都可以通過別名等方式轉換成非環狀的(BIEE 10g在邏輯層是不允許建立環狀模型的(物理層可以),而11g 則沒有了這個限制)
但是某種情況下,還真需要環狀模型。
考慮如下簡單模型
可以看到,上圖中的產品維采用了Type2 的緩慢變化維;因此其含有開始時間和結束時間字段為于標識對應記錄的有效時間段。
考慮如下需求,一個儀表盤提示有兩個字段,分別是“CALENDAR_YEAR”(Dim_Date)、“PROD_DESC”(Dim_Products);客戶要求當我選定了“年”之后,“產品描述”里
只能出現對應年的“產品描述”,拿同一個產品為例,比如:
年 產品編碼 產品描述
1998 TP_123 產品A_OLD
1999 TP_123 產品A_NEW
當我選了1999年之后只能出現產品A_NEW,而不要出現產品A_OLD
新手拿到這個問題都會覺得很“簡單”,只要PROD_DESC的值受CALENDAR_YEAR限制即可,如下圖所示:
OK,大功告成!測試測試,
選擇好CALENDAR_YEAR,然后在選擇PROD_DESC。
1分鐘、2分鐘.....
10分鐘過去了怎么PROD_DESC還出不來!
這是很多新手經常會遇到的一個問題,為什么會這樣?
很簡單,因為在維度模型中,維表與維表的關聯關系都存在于事實表之中,想要用一個維度的值去限定另一個維度的值必然要連接事實表,
所以在提示中用一個維度去限制另一個維度肯定會有性能問題(當然了,事實表數據量小性能會在可接受范圍內)
那么我們應該怎么來處理這種問題呢?
實際上這種問題從根本上是因為產品維和時間維并非毫無關聯,而是存在著一定的聯系(因為某條產品記錄只在某個時間段內有效)
這個時候我們可以引入一個支架時間維,將它與產品維連接起來,如下圖所示:
其中Dim_Date_Products_LifeCycle和Dim_Date都是真實物理表TIMES的別名(使用別名,是我們在BIEE中實現角色扮演維的常用手段)
這樣的話,我們能可以很方便的使用Dim_Date_Products_LifeCycle來對Dim_Products進行篩選了(前端只需要使用等于Dim_Date_Products_LifeCycle上的某個時間點,而不用去寫復雜的>=開始時間 and <結束時間這樣的邏輯了)
接下來又有一個問題,我們是把這個支架維放在邏輯層的產品維度里呢,還是放在時間維度里呢?
如果放在產品維度里把其當成產品上的一個屬性是說得過去的,但是這樣的話又回到我們在做提示的時候還是會遇到前面所說的問題。
我們需要的是把這個支架時間維和真正的時間維合2為一,也就是說,當我們指定了時間(通過時間維的字段),這個值需要自動傳遞到支架維上
然后支架維去關聯產品維以取出對應時間段的產品描述(而無須關聯事實表)
How can we do?
一步一步的來吧,合2為一我們肯定就會想到利用邏輯層的多LTS(Logic Table Source),如下圖所示:
注意:不要修改Dim_Date中,兩個LBS的“優先級組”,讓它們都默認為0
我們希望的是,如果我在answer里只選擇時間和產品兩個字段,那么BI Server就選擇Dim_Date的Dim_Date_Products_LifeCycle去關聯Dim_Products表(它們有直接關聯)而不要選擇
Dim_Date(因為一旦選擇了它,則必然會關聯事實表,因為Dim_Date和Dim_Products是沒有直接關聯的)
而當我們同時指定了時間、產品以及指標的時候,我們希望的是BI Server選擇Dim_date和Dim_Products與事實表關聯
通過測試,目前這樣并不能達到我們的要求,BI Server始終都要去關聯事實表,為什么?
大家仔細看目前的邏輯模型圖,只看邏輯模型的話,BI Server所得知的Dim_Products和Dim_Date之間是沒有直接關聯路徑的(雖然它們的LBS在物理層有),
我們需要把這種關聯關系告訴給BI Server,也就是如下圖所示:
注:如果沒記錯,邏輯環狀模型在BIEE 10g中是不支持的
這要就行成了一個環狀的模型!當我們只選擇Dim_Date和Dim_Products的時候,BI Server就會走路徑1;
當選擇Dim_Date、Dim_Products、Fact_Sales的時候,BI Server就會走路徑2
OK,下面讓我們看一下測試結果吧!
新建如下圖的提示:
其中PROD_DESC的取值受CALENDAR_YEAR限制,當我們選定好年之后,我們就只能在PROD_DESC中選擇對應年的成員值了,SQL如下:
select distinctT195345.PROD_DESC asc1
from
TIMES T195762 /* Dim_Date_Products_LifeCycle */,
PRODUCTS T195345 /* Dim_Products */
where( T195762.CALENDAR_YEAR = 1999andT195762.TIME_ID < T195345.PROD_EFF_TO andT195762.TIME_ID >= T195345.PROD_EFF_FROM )
orderbyc1
如我們所愿,沒有關聯事實表
下面我們在看看兩都同時指定,并有指標的情況下,會按我們所希望的那樣嗎
WITH
SAWITH0 AS ( select sum(T195337.AMOUNT_SOLD) asc1,
T195298.CALENDAR_YEAR asc2,
T195345.PROD_DESC asc3
from
TIMES T195298 /* Dim_Date */,
PRODUCTS T195345 /* Dim_Products */,
SALES T195337 /* Fact_Sales */
where( T195298.CALENDAR_YEAR = 1999andT195298.TIME_ID = T195337.TIME_ID andT195337.PROD_ID = T195345.PROD_ID andT195345.PROD_DESC = '3DVD-R Discs, 4.7GB, Pack of 5')
groupbyT195298.CALENDAR_YEAR, T195345.PROD_DESC)
select distinct0asc1,
D1.c2 asc2,
D1.c3 asc3,
D1.c1 asc4
from
SAWITH0 D1
orderbyc2, c3
可以看到,此時走的是路徑2,也就是我們所希望的那樣。
完!
轉載請保留以下內容:
本文來源自天善社區風在身后老師的博客(公眾號)。
原文鏈接: https://ask.hellobi.com/blog/lele5000/658
轉載請注明來自夕逆IT,本文標題:《驍龍710火力全開,100%壓榨手機性能頭條》

還沒有評論,來說兩句吧...