大家都知道,在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。對乙個...