2014-08-29 29 views
5

我建立了一個模型,icCube在總帳代碼塊,它具有以下尺寸(非限制性)的頂部:MDX - 大CROSSJOIN與非空 - 如何優化性能

  • 時間
  • 實體
  • 成本中心
  • 帳戶
  • 公司間黨
  • 項目
  • 活動
  • 量(這是值)

在這個模型中的工具規劃加載,存在性能問題,當你有在x軸多於3個維度坍塌至底部水平。

我是想檢查是否icCube可以處理這個更好的,但與3個維度的聲明瞭我1700多秒時:

select [Dec] on 0 
, non empty { Descendants([Account].[Account].[Total],,leaves) } 
    * { Descendants([Activity].[Activity].[Total],,leaves) } 
    * { Descendants([CostCenter].[CostCenter].[Total],,leaves) } on 1 
from finance 

之所以對行多個維度是用戶希望看到的儘可能多的代碼塊細節,最好是完整的代碼塊。

我被其他工具很容易處理這種事情的事實所挑戰,因爲它沒有底層的OLAP數據庫,但它直接使用層次結構查詢數據單元。在Excel中查詢數據摘錄(沒有太多數據行)時獲得相同的性能。

信息上的數據:

  • 尺寸是相當巨大的:400個賬戶,6000+活動,50個單位,500個CostCenters
  • 尺寸和活動項目是非常平坦的(幾乎沒有結構)
  • 只有50.000數量,所以數據非常稀疏

任何建議或提示如何解決這個問題?

回答

4

它在MDX,經典的問題值得創建MDX反模式,並把它作爲數字1

你計算會產生400x60000x500 = 120億(12×10^9)的元組的交叉連接,我們在問到評估它們中的每一個。這使得每秒進行很多評估。

看起來像一個「奇怪」的方式做鑽取。我會去尋找一個drillthrough,但我們試着在MDX中解決這個問題:

該解決方案試圖儘可能減少通過執行nonempty生成的元組的數量。所以:

noempty(noempty(A) x noempty(B)) x noempty(C) 
    or 
noempty(A) x noempty(noempty(B) x noempty(C)) 

使用第一版本少一些非空:

select 
[Dec] on 0, 
nonempty( 
    nonempty( 
     Descendants([Account].[Account].[Total],,leaves) 
    * nonempty(Descendants([Activity].[Activity].[Total],,leaves) , [DEC]) 
    , [DEC]) 
    * { Descendants([CostCenter].[CostCenter].[Total],,leaves) } 
, [DEC]) 
on 1 
from [finance] 

在icCube您將創建一個Function執行此操作,簡化的語法:

Function megaCrossjoin1(A,B,C,M) as nonempty(nonempty(A,M) * nonempty(B,M), M) * nonempty(C,M) 

和使用它

megaCrossjoin1( 
    Descendants([Account].[Account].[Total],,leaves) , 
    Descendants([Activity].[Activity].[Total],,leaves) , 
    Descendants([CostCenter].[CostCenter].[Total],,leaves) , 
    [Dec]) 

希望它有幫助

+0

在我的情況下,使用這種技術使交叉連接不可管理。 – 2015-08-19 04:48:05