MDX IF函式或宣告

2021-08-26 22:48:32 字數 1184 閱讀 2491

大家都知道,在scope應盡量避免使用if函式或宣告。為什麼?

if內部會被重寫為iif,假設scope內,

evaluation node

subspace s0

if condition;

this=calc1; higher priority

end if

subspace s1

this = calc2; lower priority

subspace s2

實際上,mdx enginge 並不考慮在scope內if的條件,只有在執行時才評價它的條件。

乙個問題是,為什麼cacl1,calc2有自己的subspace1,subspace2,而不是和evaluation的subspace0 一樣?

原因在於,計算的範圍可能低於評價的層次。例如,查詢在年的層次,但計算需要月的層次。

上面的if內部會重寫成iif,

evaluation node

subspace s0

this = iif(condition,cacl1,null);

subspace s1

this = iif(disjointtest,cacl2,null);

subspace s2

注意: disjointtest 是乙個內部函式,它輸入乙個單元,如果這個單元不在高優先順序計算內,返回結果true。

當s1,s2處於同乙個層次,如果if條件返回false,它返回true,這樣,它退回到not 條件;

當s2低於s1,它首先會發現s1內單元包括s2的單元,接著評價被包括的單元的not條件。

這點不同於iif,處於同乙個subspace. 所以,if可能會評價比原先更多的單元。

例外的是:

如果calc2是semi-additive measure,unary operator, storage engine query,s2並不會被重寫為iif。

cacl2並評價為乙個更大的subspace,

如果僅是取資料,即storage engine query,沒有問題,除非資料巨大,需要大量的disk ios;

如果是semi-additive measure, or unary operator, s2會成為不準確,因為它的subspace大。

乙個不準確的subspace 會導致mdx在s2建立子樹時,採用 cell-by-cell mode。

MDX IF函式或宣告

大家都知道,在scope應盡量避免使用if函式或宣告。為什麼?if內部會被重寫為iif,假設scope內,evaluation node subspace s0 if condition this calc1 higher priority end if subspace s1 this calc2...

static在宣告 變數 或 函式 時的作用

宣告變數 static宣告變數,往往用於函式中的區域性變數,如 void test static int a 10 printf d a a printf d a 我們要明確的是,函式中,被static宣告的區域性變數,不會隨函式的結束而釋放。static宣告的變數只會被初始化一次。那麼,當此函式第...

理解函式宣告 signal函式的宣告

分兩步分析 假定變數fp是乙個函式指標,呼叫方法如下 fp 因為fp是乙個函式指標,那麼 fp就是該指標指向的函式,所以 fp 就是呼叫該函式的方式。ansi c標準允許程式設計師將上式簡寫為fp 的運算子高於 2.使用具體的函式指標替換fp,此處將0做型別強制轉換,轉換為函式指標,替換fp。對乙個...